此文已由做者嶽猛受權網易雲社區發佈。
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攻擊?