赞
踩
Spark默认是集成log4j作为日志框架的,因此在我们的Spark作业中也使用log4j来输出日志。
不过,如果只是简单地将自定义的log4j.properties文件扔进项目的resources文件夹,然后直接打包运行的话,会发现程序根本不会鸟它,打印出来的日志与之前完全相同,也不会输出到文件。这时可以在spark-submit的driver JVM参数中,打开log4j的调试开关:
- bin/spark-submit \
- ......
- --conf "spark.driver.extraJavaOptions=-XX:+UseG1GC -Dlog4j.debug=true" \
- ......
然后程序运行时就会输出当前生效的log4j配置文件路径。我们是基于CDH安装的Spark,配置文件路径是/etc/spark/conf/log4j.properties,也就是默认的配置。它的内容如下:
- 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即可,如:
- 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参数如下:
- --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界面查看:
log4j.appender.R.File=${spark.yarn.app.container.log.dir}/spark.log
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。