You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

问题根源

  1. Spark日志滚动参数适用限制:spark.executor.logs.rolling.*参数仅在Spark独立模式或YARN客户端模式下,对Executor本地的stdout/stderr日志文件生效;YARN集群模式下,Executor日志默认由NodeManager收集,这些参数无法直接控制YARN聚合后的日志滚动。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:27:04