参考解决spark streaming长时间运行日志不断增长问题
目的
本教程适用以下问题:
- spark stream运行过久时,日志不断增长
- 希望修改输出日志的格式
- 配置executor端的输出
正文
在cluster模式下,spark-submit
添加如下参数。两个--conf
分别为driver和executor设置log4j的配置文件,--files
将文件上传到集群
--conf spark.driver.extraJavaOptions=-Dlog4j.configuration=file:driver-log4j.properties
--conf spark.executor.extraJavaOptions=-Dlog4j.configuration=file:executor-log4j.properties
--files ./driver-log4j.properties,./executor-log4j.properties
driver-log4j.properties
代码语言:javascript复制log4j.rootLogger =info,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm} %5p %t %c{2}:%L - %m%n
此处driver端只进行标准输出, 并不保存到文件。如果保存到文件,路径中不要使用${spark.yarn.app.container.log.dir}
,因为driver初始化log4j时,该参数还未设置,直到executor启动时才设置。
executor-log4j.properties
log4j.rootLogger =info,stdout,rolling
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm} %5p %t %c{2}:%L - %m%n
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} %5p %t %c{2}:%L - %m%n
log4j.appender.rolling.maxFileSize=100MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=${spark.yarn.app.container.log.dir}/stdout
log4j.appender.rolling.encoding=UTF-8
${spark.yarn.app.container.log.dir}
这个参数[1]来自spark官网running-on-yarn教程,
If you need a reference to the proper location to put log files in the YARN so that YARN can properly display and aggregate them, use spark.yarn.app.container.log.dir in your log4j.properties. For example, log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log. For streaming applications, configuring RollingFileAppender and setting file location to YARN’s log directory will avoid disk overflow caused by large log files, and logs can be accessed using YARN’s log utility.
值得留意的是,如果你不配置该参数,会报错java.io.FileNotFoundException。
executor既进行标准输出又要输出到文件。标准输出其实主要是方便client时调试;在cluster模式下,如果不需要在打印台查看日志,标准输出完全可以去掉。输出到文件有利于在webUI里查看。 log4j.appender.rolling.file的文件为stdout,方便对标准输出的日志和输出到文件的日志进行统一的日志滚动管理,避免标准输出的日志文件越来越大。(当文件过大后,会出现stdout、stdout.1、stdout.2等文件)
- 关于这个参数,还建议阅读https://anil.cloud/2017/07/11/an-approach-for-logging-in-spark-jobs/ ↩