Spark Streaming YARN模式下容器日志在线清理与自动配置问询
针对你遇到的Spark Streaming作业因NodeManager本地磁盘满触发SIGTERM终止的问题,我分不中断作业的手动清理方案和自动清理配置项两部分给你具体解决办法:
一、不关闭应用的前提下手动清理日志
你已经启用了YARN日志聚合,已完成的容器日志会被上传到HDFS(或你配置的远程存储),本地的临时日志是可以安全清理的,但绝对不能直接删除正在运行的容器文件,推荐用YARN官方提供的安全命令:
清理单个NodeManager的本地过期日志/临时文件:
yarn node -cleanup --nm <NodeManager主机名或IP>如果省略
--nm参数,默认会清理当前节点的NodeManager本地目录。这个命令只会删除已完成容器的日志和临时文件,完全不会影响正在运行的Spark Streaming作业容器。如果是多节点集群,可以用批量执行工具(比如Ansible、Shell脚本)在所有NodeManager节点上运行这个命令,快速释放全集群的磁盘空间。
注意:不要直接手动删除
/mnt/resource/hadoop/yarn/local或log目录下的文件,很可能误删正在运行的容器的临时数据,导致作业报错甚至崩溃。
二、启用自动清理的配置项
要从根源解决这个问题,需要配置YARN和Spark的自动清理规则,以下是关键配置:
1. YARN层面(核心配置,修改yarn-site.xml)
这些配置控制NodeManager本地日志和临时文件的自动清理:
yarn.nodemanager.log.retain-seconds:本地保留已完成容器日志的时长,默认是86400秒(24小时)。建议调短到43200秒(12小时)甚至18000秒(5小时)——因为日志已经聚合到远程存储,本地无需长时间保留。yarn.nodemanager.log-dirs-cleanup.interval-ms:检查并清理过期日志的间隔,默认是600000毫秒(10分钟),可以保持默认或根据需要调小。yarn.nodemanager.local-dirs-cleanup.interval-ms:清理local-dirs中临时文件的间隔,默认600000毫秒(10分钟)。yarn.nodemanager.localizer.cache.cleanup.interval-ms:清理本地化资源缓存的间隔,默认3600000毫秒(1小时),可以调短到1800000毫秒(30分钟)。yarn.log-aggregation.retain-seconds:远程存储(HDFS)中聚合日志的保留时长,根据你的业务需求设置,比如604800秒(7天),避免远程存储也被占满。
配置修改后需要重启NodeManager生效。
2. Spark层面(减少日志产生,从源头优化)
除了YARN的清理配置,还可以调整Spark的日志输出,从根源减少日志量:
- 降低Spark日志级别:在作业的
log4j.properties(或log4j2.properties)中,将Spark相关组件的日志级别从INFO改为WARN或ERROR,比如:log4j.logger.org.apache.spark=WARN log4j.logger.org.apache.spark.streaming=WARN - 限制容器日志大小:提交Spark作业时添加以下配置,避免单个日志文件过大:
当日志达到阈值时会自动滚动,防止占用过多磁盘空间。--conf spark.yarn.app.container.log.dir.size=2048 \ # 日志目录总大小上限(单位:MB) --conf spark.yarn.app.container.log.filesize=512 # 单个日志文件大小上限(单位:MB)
总结
先用yarn node -cleanup快速释放当前磁盘空间,避免作业再次被终止;然后配置YARN的自动清理参数,结合Spark日志优化,从根源上解决磁盘占满的问题。这样你的Spark Streaming作业就能稳定长期运行了。
内容的提问来源于stack exchange,提问作者vijay




