[平臺建設] 大資料平臺如何實現任務日誌採集

chaplinthink發表於2021-12-30

背景

平臺任務主要分3種: flink實時任務, spark任務,還有java任務,spark、flink 我們是執行在yarn 上, 日常排錯我們通過檢視yarn logs來定位, 但是會對日誌儲存設定一定的保留時間, 為了後續更好排查問題,希望能夠將spark、flink、java任務都收集起來儲存到ES中,提供統一查詢服務給使用者. 這是設計的動機.

針對這個想法,主要要解決幾個問題?

  1. Flink、Spark、java 日誌如何進行採集

  2. 如何在保證耦合度儘量低的情況下,同時保證不影響任務

  3. 部署方便, 使用者端儘量少操作

調研

通過調研相關資料,選擇基於Log4自定義Appender實現,實現方式比較優雅,輕量級, 好維護.

log4介紹

log4j主要有三個元件:

  • Logger:負責供客戶端程式碼呼叫,執行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
  • Appender:負責日誌的輸出,Log4j已經實現了多種不同目標的輸出方式,可以向檔案輸出日誌、向控制檯輸出日誌、向Socket輸出日誌等。
  • Layout:負責日誌資訊的格式化。

呼叫log4j各元件執行順序:

TgO9ns.png

實現自定義log4j Appender:

  • 繼承log4j公共的基類:AppenderSkeleton
  • 列印日誌核心方法:abstract protected void append(LoggingEvent event);
  • 初始化載入資源:public void activateOptions(),預設實現為空
  • 釋放資源:public void close()
  • 是否需要按格式輸出文字:public boolean requiresLayout()

正常情況下只需覆蓋append方法即可。然後就可以在log4j中使用了

java任務採集

java任務, 只需要引入我們自己實現自定義的log4j Appender, 我們獲取到相關的日誌資訊就可以進行後續操作.

Flink任務採集

Flink任務因為其提交在yarn上執行,我們需要採集除了日誌資訊之外,還要想辦法獲取任務對應的application id, 這樣更方便使用者查詢對應日誌,同時設計要滿足可以進行查詢taskManger,nodemanager各個節點日誌

System.getProperty("sun.java.command") 獲取當前正在執行的類, 根據其返回的字串處理後,就可以獲取需要的相關資訊, 這個返回結果,我們在yarn log 是可以看到的,靈感也來與此

如何判斷不同節點呢?

根據包含類 org.apache.flink.yarn.entrypoint.YarnJobClusterEntrypoint 判斷是否是jobManager 日誌

根據返回值包含org.apache.flink.yarn.YarnTaskExecutorRunner判斷是否是taskManager節點日誌

Spark任務採集

跟flink 處理類似

根據

org.apache.spark.executor.CoarseGrainedExecutorBackend 可以判斷出是executor日誌

org.apache.spark.deploy.yarn.ApplicationMaster 是driver日誌

部署

1.log4j.properties 配置:

log4j.rootCategory=INFO, customlog, console

 log4j.appender.customlog=com.aa.log.CustomlogAppender
 29 log4j.appender.customlog.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
 30 log4j.appender.customlog.layout=org.apache.log4j.PatternLayout

customlog 是我們自己定義的logAppender 實現

  1. 將自定義Appender程式打包

  2. 將其放到我們的Flink、Spark包下即可

  3. java 程式採集要引入我們的jar,排除其它日誌框架引入

採集架構設計

Tgcp38.png

  1. 通過log4j appender 將採集的日誌傳送到接收中心,這裡注意搞個buffer,通過http批量傳送到接收中心,日誌太小過濾掉. 這裡可以根據實際情況設定相應的策略,比如一分鐘寫入非常多的訊息有可能使用者亂打日誌,我們就停止傳送,避免將磁碟寫滿,影響其它使用者使用

  2. 接收中心主要是負責接收到訊息然後將其寫入到kafka中.

  3. Flink 消費kafka的日誌,進行簡單的清洗轉換後將資料sink到es中

  4. 使用者通過介面根據各種條件如applicationId、時間、不同角色節點篩選,搜尋到對應日誌

總結

本文主要介紹了下基於log4j 自定義appender,實現了大資料平臺相關任務日誌的採集,針對不同型別任務的處理,獲取最終我們平臺搜尋需要的功能. 日誌採集注意採集量過猛可能會將磁碟打滿,需要有相應的降級或者預防措施,使用者不會考慮太多關於平臺相關的東西. 大資料平臺技術目前各大公司很多技術架構都差不多,就看細節的處理了.

參考

https://www.cnblogs.com/grh946/p/5977046.html

相關文章