1 背景
在測試spark計算時,將作業提交到yarn(模式–master yarn-cluster)上,想查看print到控制台這是很難的,因為作業是提交到yarn的集群上,所以,去yarn集群上看日志是很麻煩的,但是又需要看print的信息,方便調試或者別的目的。
Spark日志確切的存放路徑和部署模式相關,如果是YARN模式,最簡單地收集日志的方式是使用YARN的日志收集工具(yarn logs -applicationId
),這個工具可以收集你應用程序相關的運行日志,但是這個工具是有限制的:應用程序必須運行完,因為YARN必須首先聚合這些日志;而且你必須開啟日志聚合功能(yarn.log-aggregation-enable
,在默認情況下,這個參數是false)。
2 日志配置
如果你運行在YARN模式,你可以在ResourceManager節點的WEB UI頁面選擇相關的應用程序,在頁面點擊表格中Tracking UI列的ApplicationMaster,這時候你可以進入到Spark作業監控的WEB UI界面,這個頁面就是你Spark應用程序的proxy界面,比如http://host:port/proxy/application_1430820074800_0322,當然你也可以通過訪問Driver所在節點開啟的4040端口,同樣可以看到這個界面。
到這個界面之后,可以點擊Executors菜單,這時候你可以進入到Spark程序的Executors界面,里面列出所有Executor信息,以表格的形式展示,在表格中有Logs這列,里面就是你Spark應用程序運行的日志。如果你在程序中使用了println(....)輸出語句,這些信息會在stdout文件里面顯示;其余的Spark運行日志會在stderr文件里面顯示。
在默認情況下,Spark應用程序的日志級別是INFO的,我們可以自定義Spark應用程序的日志輸出級別,可以到$SPARK_HOME/conf/log4j.properties
文件里面進行修改,比如:
1 spark.root.logger=WARN,console 2 log4j.rootLogger=${spark.root.logger} 3 log4j.appender.console=org.apache.log4j.ConsoleAppender 4 log4j.appender.console.target=System.err 5 log4j.appender.console.layout=org.apache.log4j.PatternLayout 6 log4j.appender.console.layout.ConversionPattern=%d (%t) [%p - %l] %m%n
這樣Spark應用程序在運行的時候會打出WARN級別的日志,然后在提交Spark應用程序的時候使用--files
參數指定上面的log4j.properties
文件路徑即可使用這個配置打印應用程序的日志。
以上是如何配置,如果希望一方面把代碼中的println打印到控制台,另一方面又保留spark 本身輸出的日志,可以將它輸出到日志文件中。
log4j.rootCategory=INFO, console,FILE
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.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.file=/home/hadoop/spark.log
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
# spark
log4j.logger.org.apache.spark=INFO