spark日誌配置及問題排查方式。

此文已由做者嶽猛受權網易雲社區發佈。
node


歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。apache


任什麼時候候日誌都是定位問題的關鍵,spark也不會例外,合適的配置和獲取spark的driver,am,及executor日誌將會提高問題定位的效率,這裏初步整理了spark的一些配置,更好的日誌配置還須要根據實際的狀況。安全

1)dirver日誌的配置,能夠經過spark.driver.extraJavaOptions設置加載log4j.properties文件的路徑,如:服務器

spark.driver.extraJavaOptions        -Dlog4j.configuration=file:/home/hadoop/ym/spark-1.6.1-bin-hadoop2.6/conf/log4j.properties app

具體log4j.properties參考:eclipse

# Set everything to be logged to the console
log4j.rootCategory=INFO, console,rolling
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.rolling.Append=true
log4j.appender.rolling.Encoding=UTF-8
log4j.appender.rolling.MaxBackupIndex=5
log4j.appender.rolling.MaxFileSize=200MB
log4j.appender.rolling.file=/home/hadoop/ym/logs/${spark.app.name}.driver.log
log4j.logger.org.apache.spark=INFO
log4j.logger.org.eclipse.jetty=WARN

這樣的配置可使Application的日誌以AppName.driver.log的形式存放於你指定的目錄。oop

2)executor的日誌,能夠經過spark.executor.extraJavaOptions設置加載log4j.properties文件的路徑,如:學習

spark.executor.extraJavaOptions     -Dlog4j.configuration=file:/home/hadoop/ym/spark-1.6.1-bin-hadoop2.6/conf/log4j-executor.propertiesui

具體log4j.properties參考:spa

# Set everything to be logged to the console
log4j.rootCategory=INFO,rolling
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.rolling.Append=true
log4j.appender.rolling.Encoding=UTF-8
log4j.appender.rolling.MaxBackupIndex=5
log4j.appender.rolling.MaxFileSize=2MB
log4j.appender.rolling.file=${spark.yarn.app.container.log.dir}/stdout
log4j.logger.org.apache.spark=DEBUG
log4j.logger.org.eclipse.jetty=WARN
其中executor日誌分爲運行時日誌以及結束日誌,兩種日誌分別存放於不一樣的位置,運行時候的日誌文件存放於yarn.nodemanager.log−dirs/{ApplicationID},如:
<property>
   <name>yarn.nodemanager.log-dirs</name>
   <value>file:/mnt/ddb/2/hadoop/nm</value>
</property>

那麼運行時候的executor日誌存放於:

root@xxx:/mnt/ddb/2/hadoop/nm/application_1471515078641_0007# ls

container_1471515078641_0007_01_000001  container_1471515078641_0007_01_000002  container_1471515078641_0007_01_000003

其中container_1471515078641_0007_01_000001爲RM爲application_1471515078641_0007分配的第一個container,即AM所在的container,第一個container都是運來啓動AM的,containerID形式爲,container_APPID_01_000001,你在RM日誌文件裏面根據container_APPID搜索便可看到爲該APPID分配的container的分佈狀況及生命週期。

運行結束之後日誌會聚合到HDFS上面去,具體路徑爲/tmp/logs/${user}/logs,如:

drwxrwx---   - root supergroup          0 2016-08-18 18:29 /tmp/logs/root/logs/application_1471515078641_0002

drwxrwx---   - root supergroup          0 2016-08-18 19:10 /tmp/logs/root/logs/application_1471515078641_0003

drwxrwx---   - root supergroup          0 2016-08-18 19:17 /tmp/logs/root/logs/application_1471515078641_0004

3)am的日誌配置,能夠經過spark.yarn.am.extraJavaOptions設置加載log4j.properties文件的路徑,如:

spark.yarn.am.extraJavaOptions     -Dlog4j.configuration=file:/home/hadoop/ym/spark-1.6.1-bin-hadoop2.6/conf/log4j-executor.properties

由於am和executor都是運行在container裏面,具體log4j.properties能夠參考executor的,這裏再也不多說。

補充一些:

下面重點說下,碰見spark問題該怎麼去排查日誌,都排查哪些日誌,spark的運行流程能夠參考http://ks.netease.com/blog?id=5174,這這邊每一個過程都表明着不一樣的日誌文件。

一,SC初始化的過程當中出現問題的排查方式

1)driver提交到RM的時候,若是提交不上去,首先排查driver日誌,其次根據APPID排查RM日誌看下APP生命週期

2)RM啓動AM的過程出現問題,首先排查RM日誌看爲APP分配的第一個container下發到哪一個NM上面去了,到對應的NM上面去根據containerID查看其生命週期哪裏出現問題了

3)AM啓動了,向RM申請container的過程出現了問題,首先查看am的日誌,即第一個container的日誌,排查下都申請了哪些container,這些container都下發了哪些節點,而後到對應節點的NM日誌上根據containerID查看其生命週期狀況

4)executor啓動了,沒法註冊到driver,這時候就要去查看對應的executor的日誌

二,SC.action之後的問題排查

1)首先在driver日誌裏面去查看都有哪些job,哪些job failed了,而後找到failed的job,查看該job都有哪些stage,而後排查下那個stage失敗了,而後去查看該stage都有哪些task,哪一個task失敗了,找到失敗的task下發的executor,而後去這個executor日誌上,根據task id排查這個task的生命週期。

2)若是是executorLost的,除了要看這個executor的日誌外,還要看這個container所在的nm日誌,看下根據containerID看下器生命週期

3)若是是寫HDFS上出現問題了,首先排查nm日誌,根據nm日誌去排查出現問題的datanode日誌。

中間有些因爲本身理解的不事很好,可能存在問題,請見諒。

最後說一點,排查問題是學習的最好方式,排查完以後能深刻了的明白原理,問題處理的越多,學習也就越快,每一個人都是從一頭霧水走過來。


免費體驗雲安全(易盾)內容安全、驗證碼等服務


更多網易技術、產品、運營經驗分享請點擊




相關文章:
【推薦】 四兩撥千斤式的攻擊!如何應對Memcache服務器漏洞所帶來的DDoS攻擊?

相關文章
相關標籤/搜索