在很多情況下,我們需要查看driver和executors在運行Spark應用程序時候產生的日志,這些日志對於我們調試和查找問題是很重要的。
Spark日志確切的存放路徑和部署模式相關:
(1)、如果是Spark Standalone模式,我們可以直接在Master UI界面查看應用程序的日志,在默認情況下這些日志是存儲在worker節點的work目錄下,這個目錄可以通過SPARK_WORKER_DIR
參數進行配置。
(2)、如果是Mesos模式,我們同樣可以通過Mesos的Master UI界面上看到相關應用程序的日志,這些日志是存儲在Mesos slave的work目錄下。
(3)、如果是YARN模式,最簡單地收集日志的方式是使用YARN的日志收集工具(yarn logs -applicationId
),這個工具可以收集你應用程序相關的運行日志,但是這個工具是有限制的:應用程序必須運行完,因為YARN必須首先聚合這些日志;而且你必須開啟日志聚合功能(yarn.log-aggregation-enable
,在默認情況下,這個參數是false)。
如果你運行在YARN模式,你可以在ResourceManager節點的WEB UI頁面選擇相關的應用程序,在頁面點擊表格中Tracking UI
列的ApplicationMaster
,這時候你可以進入到Spark作業監控的WEB UI界面,這個頁面就是你Spark應用程序的proxy界面,比如http://www.iteblog.com:9981/proxy/application_1430820074800_0322,當然你也可以通過訪問Driver所在節點開啟的4040端口,同樣可以看到這個界面。
到這個界面之后,可以點擊Executors
菜單,這時候你可以進入到Spark程序的Executors
界面,里面列出所有Executor信息,以表格的形式展示,在表格中有Logs
這列,里面就是你Spark應用程序運行的日志。如果你在程序中使用了println(....)
輸出語句,這些信息會在stdout文件里面顯示;其余的Spark運行日志會在stderr文件里面顯示。
在默認情況下,Spark應用程序的日志級別是INFO的,我們可以自定義Spark應用程序的日志輸出級別,可以到$SPARK_HOME/conf/log4j.properties
文件里面進行修改,比如:
08 |
spark.root.logger=WARN,console |
10 |
log4j.rootLogger=${spark.root.logger} |
12 |
log4j.appender.console=org.apache.log4j.ConsoleAppender |
13 |
log4j.appender.console.target=System.err |
14 |
log4j.appender.console.layout=org.apache.log4j.PatternLayout |
15 |
log4j.appender.console.layout.ConversionPattern=%d (%t) [%p - %l] %m%n |
這樣Spark應用程序在運行的時候會打出WARN級別的日志,然后在提交Spark應用程序的時候使用--files
參數指定上面的log4j.properties
文件路徑即可使用這個配置打印應用程序的日志。