Spark Streaming作业日志大小控制及滚动日志配置问题
解决HDInsight YARN模式下Spark Streaming日志占满磁盘的问题
你遇到的这个问题很典型——在YARN模式下,Spark Executor的日志管理逻辑和Standalone模式完全不同,所以你代码里设置的spark.executor.logs.rolling.*参数根本不会生效,因为这些参数只适用于Spark Standalone集群的Worker节点管理日志的场景。下面给你具体的解决方法:
为什么你的配置没生效?
Spark的spark.executor.logs.rolling.maxRetainedFiles和spark.executor.logs.rolling.maxSize这两个参数,是给Spark Standalone模式设计的:当Worker节点直接管理Executor进程时,Worker会根据这些参数来滚动和清理Executor日志。但在YARN模式下,Executor进程是由YARN的NodeManager启动和管控的,日志的滚动、大小限制、保留策略完全由YARN的配置参数说了算,Spark本身管不到这部分。
正确的配置方式(HDInsight集群)
HDInsight用Ambari来管理集群配置,推荐你通过Ambari设置集群级的日志策略,这样所有作业都会生效;如果只是针对单个作业,也可以用spark-submit参数临时指定。
1. 集群级配置(通过Ambari)
- 登录你的HDInsight集群Ambari界面(通常是集群专属的Ambari访问地址)
- 找到YARN服务,进入Configs标签页
- 在搜索框里搜索以下参数,调整对应值:
yarn.nodemanager.log-roll-size:单个日志文件的最大大小,比如你要的107374182(100MB)yarn.nodemanager.log-roll-count:保留的滚动日志文件数量,设为2yarn.nodemanager.log-retain-seconds:本地日志保留的秒数,比如设为604800(7天,超时自动删除)yarn.log-aggregation.enable:确保设为true(HDInsight默认开启,会把日志聚合到存储账户)yarn.log-aggregation.retain-seconds:聚合到存储的日志保留秒数,同样可以设为604800,避免存储被占满
- 保存配置并重启YARN服务,这样新启动的Executor就会遵循这些日志策略。
2. 单作业临时配置(spark-submit)
如果不想修改集群全局配置,可以在提交Spark Streaming作业时,通过--conf参数指定YARN的日志参数:
spark-submit --class com.your.package.YourStreamingClass \ --master yarn \ --deploy-mode cluster \ --conf yarn.nodemanager.log-roll-size=107374182 \ --conf yarn.nodemanager.log-roll-count=2 \ --conf yarn.nodemanager.log-retain-seconds=604800 \ --conf yarn.log-aggregation.retain-seconds=604800 \ your-streaming-job.jar
额外提示
- 如果你已经有大量旧日志占满磁盘,可以手动清理NodeManager节点的本地日志目录(默认在
/var/log/hadoop-yarn/containers),或者通过Ambari的日志清理工具触发一次清理。 - 定期检查存储账户里的聚合日志,确保
yarn.log-aggregation.retain-seconds配置生效,避免存储持续膨胀。
内容的提问来源于stack exchange,提问作者vijay




