Spark任務中的log4j簡單配置方法

Spark默認是集成log4j做爲日誌框架的,所以在咱們的Spark做業中也使用log4j來輸出日誌。
不過,若是隻是簡單地將自定義的log4j.properties文件扔進項目的resources文件夾,而後直接打包運行的話,會發現程序根本不會鳥它,打印出來的日誌與以前徹底相同,也不會輸出到文件。這時能夠在spark-submit的driver JVM參數中,打開log4j的調試開關:python

bin/spark-submit \
......
--conf "spark.driver.extraJavaOptions=-XX:+UseG1GC -Dlog4j.debug=true" \
......

而後程序運行時就會輸出當前生效的log4j配置文件路徑。咱們是基於CDH安裝的Spark,配置文件路徑是/etc/spark/conf/log4j.properties,也就是默認的配置。它的內容以下:shell

log4j.rootLogger=${root.logger}
root.logger=INFO,console
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{2}: %m%n
shell.log.level=WARN
log4j.logger.org.eclipse.jetty=WARN
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
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.logger.org.apache.spark.repl.Main=${shell.log.level}
log4j.logger.org.apache.spark.api.python.PythonGatewayServer=${shell.log.level}

可見裏面只有控制檯的輸出。若是咱們想全局更改全部Spark做業的日誌格式,直接在這個文件裏增長或修改Appender便可,如:apache

log4j.rootLogger=INFO,C,R
# 控制檯輸出卡在WARN
log4j.appender.C=org.apache.log4j.ConsoleAppender
log4j.appender.C.Threshold=WARN
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p [%c] - %m%n
# 新增滾動文件的日誌輸出
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/var/projects/calendar/logs/calendar.log
log4j.appender.R.Threshold=INFO
log4j.appender.R.Append=true
log4j.appender.R.MaxFileSize=16MB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p [%c] - %m%n
# 如下照搬原文件配置,主要是防止一些Spark引用的第三方組件日誌輸出過多
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
......

若是不採用全局更改日誌配置的方法,還能夠單獨配置。分別更改driver和executor的spark-submit JVM參數以下:api

--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/path/to/log4j.properties"
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/path/to/log4j.properties"

咱們的做業幾乎都運行在yarn-cluster或者yarn-client模式下,須要配置文件在每一個節點上都存在,所以可能還須要用--files參數將log4j.properties上傳。
最後再更改一下日誌文件的輸出位置,就能夠將做業日誌與YARN container日誌聚合在一塊兒(回憶一下,Spark on YARN模式中,container:executor:task是1:1:n對應的),方便在UI界面查看:bash

log4j.appender.R.File=${spark.yarn.app.container.log.dir}/spark.log
相關文章
相關標籤/搜索