Spark Streaming 2.1集群模式日志占满磁盘致任务被Kill的解决咨询
解决Spark Streaming 2.1 YARN容器日志爆盘问题的可行方案
你遇到的这个问题在长期运行的Spark Streaming任务里挺常见的——跑了几周后YARN容器日志把磁盘占满,结果被Resource Manager直接干掉,而且你已经配了spark.executor.logs.rolling.maxRetainedFiles和spark.executor.logs.rolling.maxSize却没效果,对吧?下面给你几个针对性的解决思路:
先打开Spark日志滚动的总开关(关键!)
默认情况下,Spark的executor日志滚动是关闭的,你之前设置的那两个参数根本不会生效。必须先添加这个核心配置:spark.executor.logs.rolling.enable=true然后根据你的需求选择滚动策略:
- 按大小滚动(和你之前的配置匹配):
spark.executor.logs.rolling.strategy=size spark.executor.logs.rolling.maxSize=107374182 # 100MB的设置没问题 spark.executor.logs.rolling.maxRetainedFiles=2 - 按时间滚动(更适合长期运行的任务,避免短时间内生成大量小文件):
spark.executor.logs.rolling.strategy=time spark.executor.logs.rolling.interval=daily # 可选hourly、daily等 spark.executor.logs.rolling.maxRetainedFiles=7 # 保留最近7天的日志
- 按大小滚动(和你之前的配置匹配):
配置YARN层面的日志聚合与本地日志清理
就算Spark自己的日志滚动生效了,YARN NodeManager的本地日志策略也可能拖后腿。建议这么做:- 开启YARN日志聚合:把容器日志上传到HDFS,容器退出后本地日志会自动删除,从根本上解决本地磁盘占用问题。在YARN的
yarn-site.xml里加这些配置:<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> # 保留7天的HDFS聚合日志,按需调整 </property> - 缩短本地日志保留时间:如果暂时开不了日志聚合,就把NodeManager的本地日志保留时长改短:
<property> <name>yarn.nodemanager.log.retain-seconds</name> <value>43200</value> # 保留12小时,比默认的1天严格很多 </property> - 调整磁盘告警阈值:避免RM一看到磁盘满就杀容器,把
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage设为80%左右,同时确保磁盘健康检查是开启的。
- 开启YARN日志聚合:把容器日志上传到HDFS,容器退出后本地日志会自动删除,从根本上解决本地磁盘占用问题。在YARN的
降低Spark日志输出级别,减少日志量
很多时候磁盘爆了是因为Debug级别的日志刷得太勤。你可以:- 在代码里直接设置全局日志级别:
spark.sparkContext.setLogLevel("WARN") - 修改Spark的
log4j.properties文件(一般在$SPARK_HOME/conf目录下),针对性降低模块的日志级别:log4j.rootLogger=INFO, console # 给Spark Streaming相关模块降级别,减少冗余日志 log4j.logger.org.apache.spark.streaming=WARN log4j.logger.org.apache.spark.streaming.scheduler=INFO
这一步能大幅减少日志输出,从根源降低磁盘消耗。
- 在代码里直接设置全局日志级别:
排查日志目录的异常堆积
登录到磁盘占满的NodeManager节点,去yarn.nodemanager.log-dirs指定的目录看看:- 确认Spark的滚动日志是不是正常生成了,旧文件有没有按
maxRetainedFiles的设置被删掉 - 检查是不是其他应用的容器日志没被清理,或者NodeManager自己的日志占了太多空间
- 看看有没有权限问题:比如NodeManager用户没权限删除旧日志文件,导致文件越堆越多
- 确认Spark的滚动日志是不是正常生成了,旧文件有没有按
针对长期运行任务的补充优化
对于跑几周的Streaming任务,还可以加这些优化:- 定期优雅重启任务:配个
spark.streaming.stopGracefullyOnShutdown=true,每周或每两周重启一次,自动清理旧的executor日志 - 加磁盘监控:在YARN或者集群的监控系统里设个磁盘使用率告警,提前发现问题处理
- 定期优雅重启任务:配个
内容的提问来源于stack exchange,提问作者vijay
相关产品推荐
相关产品推荐

