背景
平臺任務主要分3種: flink實時任務, spark任務,還有java任務,spark、flink 我們是執行在yarn 上, 日常排錯我們通過檢視yarn logs來定位, 但是會對日誌儲存設定一定的保留時間, 為了後續更好排查問題,希望能夠將spark、flink、java任務都收集起來儲存到ES中,提供統一查詢服務給使用者. 這是設計的動機.
針對這個想法,主要要解決幾個問題?
-
Flink、Spark、java 日誌如何進行採集
-
如何在保證耦合度儘量低的情況下,同時保證不影響任務
-
部署方便, 使用者端儘量少操作
調研
通過調研相關資料,選擇基於Log4自定義Appender實現,實現方式比較優雅,輕量級, 好維護.
log4介紹
log4j主要有三個元件:
- Logger:負責供客戶端程式碼呼叫,執行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
- Appender:負責日誌的輸出,Log4j已經實現了多種不同目標的輸出方式,可以向檔案輸出日誌、向控制檯輸出日誌、向Socket輸出日誌等。
- Layout:負責日誌資訊的格式化。
呼叫log4j各元件執行順序:
實現自定義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 實現
-
將自定義Appender程式打包
-
將其放到我們的Flink、Spark包下即可
-
java 程式採集要引入我們的jar,排除其它日誌框架引入
採集架構設計
-
通過log4j appender 將採集的日誌傳送到接收中心,這裡注意搞個buffer,通過http批量傳送到接收中心,日誌太小過濾掉. 這裡可以根據實際情況設定相應的策略,比如一分鐘寫入非常多的訊息有可能使用者亂打日誌,我們就停止傳送,避免將磁碟寫滿,影響其它使用者使用
-
接收中心主要是負責接收到訊息然後將其寫入到kafka中.
-
Flink 消費kafka的日誌,進行簡單的清洗轉換後將資料sink到es中
-
使用者通過介面根據各種條件如applicationId、時間、不同角色節點篩選,搜尋到對應日誌
總結
本文主要介紹了下基於log4j 自定義appender,實現了大資料平臺相關任務日誌的採集,針對不同型別任務的處理,獲取最終我們平臺搜尋需要的功能. 日誌採集注意採集量過猛可能會將磁碟打滿,需要有相應的降級或者預防措施,使用者不會考慮太多關於平臺相關的東西. 大資料平臺技術目前各大公司很多技術架構都差不多,就看細節的處理了.