如何配置Spark Executor日志滚动且不影响其他Spark应用
Spark Executor日志滚动配置失效问题解决指南
问题背景
项目中有多个流处理Spark应用,需为指定应用(iot_engine)的Executor配置日志滚动,且不影响其他应用。已在spark-submit中配置spark.executor.logs.rolling.*参数,但日志滚动未按预期生效。
当前配置
spark-submit命令
$SPARK_HOME/bin/spark-submit \ --deploy-mode cluster \ --name iot_engine \ --master yarn \ --class $CLASSNAME \ --conf "spark.executor.extraClassPath=conf/*" \ --conf spark.yarn.tags=$APPTAG \ --files $CONF_FILES \ --executor-cores $EXECUTORCORES \ --num-executors $NUMEXECUTORS \ --conf spark.yarn.max.executor.failures=24 \ --conf spark.yarn.executor.failuresValidityInterval=2m \ --conf spark.task.maxFailures=10 \ --conf spark.yarn.maxAppAttempts=10 \ --conf spark.yarn.am.attemptFailuresValidityInterval=2m \ --conf spark.scheduler.allocation.file=fairscheduler.xml \ --conf spark.scheduler.mode=FAIR \ --conf spark.scheduler.pool=primary \ --conf spark.yarn.submit.waitAppCompletion=false \ --conf spark.yarn.jars=hdfs://$HDFS_CLUSTER/spark/jars/*.jar \ --conf "spark.executor.logs.rolling.time.interval=hourly" \ --conf "spark.executor.logs.rolling.strategy=time" \ --conf "spark.executor.logs.rolling.maxRetainedFiles=7" \ $IOTENGINE_JARPATH
log4j.properties配置
# Root logger option log4j.rootLogger=DEBUG, SysErr log4j.logger.dt.cerebrum.iotengine=INFO, SysOut, SysErr log4j.logger.com.sksamuel=DEBUG log4j.additivity.dt.cerebrum.iotengine=false # Direct info log messages to SysOut log4j.appender.SysOut=org.apache.log4j.ConsoleAppender log4j.appender.SysOut.Target=System.out log4j.appender.SysOut.layout=org.apache.log4j.PatternLayout log4j.appender.SysOut.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n log4j.appender.SysOut.filter.y=org.apache.log4j.varia.LevelRangeFilter log4j.appender.SysOut.filter.y.LevelMin=INFO log4j.appender.SysOut.filter.y.LevelMax=INFO # Direct error log messages to SysErr log4j.appender.SysErr=org.apache.log4j.ConsoleAppender log4j.appender.SysErr.Target=System.err log4j.appender.SysErr.layout=org.apache.log4j.PatternLayout log4j.appender.SysErr.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n log4j.appender.SysErr.filter.y=org.apache.log4j.varia.LevelRangeFilter log4j.appender.SysErr.filter.y.LevelMin=ERROR log4j.appender.SysErr.filter.y.LevelMax=ERROR
问题根源
- Spark日志滚动参数适用限制:
spark.executor.logs.rolling.*参数仅在Spark独立模式或YARN客户端模式下,对Executor本地的stdout/stderr日志文件生效;YARN集群模式下,Executor日志默认由NodeManager收集,这些参数无法直接控制YARN聚合后的日志滚动。 - log4j配置局限性:当前使用
ConsoleAppender仅将日志输出到stdout/stderr,未在Executor本地生成可滚动的日志文件,无法触发滚动逻辑。
解决方案
1. 修改log4j.properties,使用滚动文件Appender
将原有的ConsoleAppender替换为DailyRollingFileAppender(按时间滚动),同时保留控制台输出(方便YARN日志收集)。以下是按小时滚动的配置示例:
# Root logger option log4j.rootLogger=DEBUG, SysErr, ConsoleErr log4j.logger.dt.cerebrum.iotengine=INFO, SysOut, ConsoleOut log4j.logger.com.sksamuel=DEBUG log4j.additivity.dt.cerebrum.iotengine=false # 按小时滚动的INFO级别日志Appender log4j.appender.SysOut=org.apache.log4j.DailyRollingFileAppender # 使用Spark内置变量指定Executor日志目录,确保每个Executor日志路径唯一 log4j.appender.SysOut.File=${spark.executor.logs.dir}/executor-info.log # 按小时滚动,格式为executor-info.log.2024-05-20-14 log4j.appender.SysOut.DatePattern='.'yyyy-MM-dd-HH # 保留最近7份滚动日志 log4j.appender.SysOut.MaxBackupIndex=7 log4j.appender.SysOut.layout=org.apache.log4j.PatternLayout log4j.appender.SysOut.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n log4j.appender.SysOut.filter.y=org.apache.log4j.varia.LevelRangeFilter log4j.appender.SysOut.filter.y.LevelMin=INFO log4j.appender.SysOut.filter.y.LevelMax=INFO # 按小时滚动的ERROR级别日志Appender log4j.appender.SysErr=org.apache.log4j.DailyRollingFileAppender log4j.appender.SysErr.File=${spark.executor.logs.dir}/executor-error.log log4j.appender.SysErr.DatePattern='.'yyyy-MM-dd-HH log4j.appender.SysErr.MaxBackupIndex=7 log4j.appender.SysErr.layout=org.apache.log4j.PatternLayout log4j.appender.SysErr.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n log4j.appender.SysErr.filter.y=org.apache.log4j.varia.LevelRangeFilter log4j.appender.SysErr.filter.y.LevelMin=ERROR log4j.appender.SysErr.filter.y.LevelMax=ERROR # 保留控制台输出,用于YARN日志聚合(可选) log4j.appender.ConsoleOut=org.apache.log4j.ConsoleAppender log4j.appender.ConsoleOut.Target=System.out log4j.appender.ConsoleOut.layout=org.apache.log4j.PatternLayout log4j.appender.ConsoleOut.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n log4j.appender.ConsoleOut.filter.y=org.apache.log4j.varia.LevelRangeFilter log4j.appender.ConsoleOut.filter.y.LevelMin=INFO log4j.appender.ConsoleOut.filter.y.LevelMax=INFO log4j.appender.ConsoleErr=org.apache.log4j.ConsoleAppender log4j.appender.ConsoleErr.Target=System.err log4j.appender.ConsoleErr.layout=org.apache.log4j.PatternLayout log4j.appender.ConsoleErr.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n log4j.appender.ConsoleErr.filter.y=org.apache.log4j.varia.LevelRangeFilter log4j.appender.ConsoleErr.filter.y.LevelMin=ERROR log4j.appender.ConsoleErr.filter.y.LevelMax=ERROR
2. 调整spark-submit参数,确保自定义log4j配置生效
- 将修改后的
log4j.properties加入--files参数,确保分发到每个Executor:--files $CONF_FILES,log4j.properties - 添加配置指定Executor使用自定义log4j配置:
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j.properties"
3. 验证配置
提交应用后,登录Executor所在节点,进入${spark.executor.logs.dir}(默认路径为/var/log/hadoop-yarn/containers/container-<ID>/),查看是否生成按小时滚动的executor-info.log.*和executor-error.log.*文件。
注意事项
- 该方案仅对当前应用生效,不会影响其他Spark应用,符合需求。
- 若需按文件大小滚动,可将
DailyRollingFileAppender替换为RollingFileAppender,配置MaxFileSize和MaxBackupIndex参数。 - YARN集群模式下,聚合后的日志滚动需修改YARN全局配置,会影响所有应用,不建议操作;优先通过应用本地日志滚动实现需求。
内容的提问来源于stack exchange,提问作者Nagababu
相关产品推荐
相关产品推荐

