天天看點

SparkStreaming的log4j日志記錄

個人GitHub位址 :https://github.com/LinMingQiang

部落格前言

  • 為什麼我們要寫日志
    • 基本上每個程式都要有日志記錄的功能,日志的記錄最重要的用處就是監控程式的運作狀态和錯誤查找。如果程式沒有寫日志,那程式就像瞎子一樣,瞎跑,你都不知道為什麼資料不對,為什麼程式報錯,程式運作成功還是失敗。在流式計算Sparkstreaming中,日志的記錄是非常重要的;因為流式計算是需要7*24小時一直運作的,你不記日志你根本不知道程式運作成功還是錯誤(當然你可以通過spark的history來檢視),但是sparkstreaming的日志它隻記錄程式的内部錯誤,并不會記錄你程式的計算邏輯錯誤(是以會導緻你整個程式計算結果都不對了都不知道)。
  • Sparkstreming日志的特别
    • SparkStreming的日志是比較特别的,特别之處在于,它的日志隻有在運作完成之後才能被load到本地檢視的,不然它的日志是一直在hdfs上的。
    • 那麼,如果我們需要一個這樣的功能:需要一個監控程式來監控SparkStreaming的運作情況,并且一旦程式出問題要馬上發郵件到自己的郵箱然後自己重新開機程式。
  • 解決的思路
    • 簡單的思路:把SparkStreaming的運作模式選為yarn-client模式,那麼程式的driver就會是在固定的機子上,你可以選擇把日志都寫在這台機子上,然後在這台機子上寫一個腳本來監控這個日志檔案(tail -f 檔案路徑);你可以一直看到你日志的寫出情況。當遇到一個error日志的時候你就可以選擇處理方法。這個方法的缺點是:如果你不希望程式以yarn-client模式運作的話,而且也不想寫腳本的話。
    • 複雜一點的思路:那你可以需要借助消息隊列Kafka了。你可以選擇把日志寫入Kafka裡面,供下層消費,這個方法的好處就是,程式和日志解耦。程式隻管寫他的日志,也不管寫什麼機子,隻要給他一個brokerlist。日志也都記錄在kafka,你可以寫一個簡單的java程式來監控它。spark照樣可以使用yarn-cluster模式。
  • 使用自定義的log4j配置
    • 通常一個叢集會有很多個的spark任務,每個任務都會記日志,如果都使用spark預設的日志配置檔案,那将會很難控制和維護。是以需要使用自定義的log4j配置。每個程式都自帶一個配置。
    • 你自己寫一個log4j.properties然後在運作程式的時候指定用這個配置檔案就好了,那麼問題來了。yarn的運作有兩種模式,兩種的指定方式不一樣
    • yarn-client:這個簡單,–conf “spark.driver.extraJavaOptions=-Dlog4j.configuration=file:///data/test/log4j-spark.properties”。這個路徑是你本地路徑
    • yarn-cluster:–files /data/lmq/test/log4j-spark.properties –conf “spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-spark.properties” –conf “spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-spark.properties”
  • 實作設計
    • 想要實作代碼和配置的可以在評論區留言,我一直線上,我會一一回複的

繼續閱讀