Spark YARN集群模式下stderr/stdout日志文件被截断问题排查求助
Spark YARN集群模式日志1分钟截断问题排查方向
一、YARN核心日志聚合与清理配置核查
- 核查
yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds:该配置控制NodeManager检查日志文件是否需要滚动聚合的间隔,若设置为60秒,会每分钟触发一次日志滚动,直接截断正在写入的stderr/stdout文件。 - 核查
yarn.nodemanager.log.retain-seconds与yarn.nodemanager.delete.debug-delay-sec:前者是NodeManager保留本地容器日志的时长,后者是容器退出后延迟清理本地日志的时间,若其中任意一项设为60秒,可能导致日志被过早清理或截断。 - 检查NodeManager节点的定时任务:排查是否存在系统crontab或自定义脚本,每分钟清理
yarn.nodemanager.log.dir下的容器日志目录。
二、Spark日志轮转配置冲突排查
- 核查Spark自带的日志轮转参数:即使自定义了log4j配置,
spark.executor.logs.rolling.interval、spark.executor.logs.rolling.policy等参数若设置为1分钟,会强制触发日志滚动,覆盖log4j的配置逻辑。 - 确认
spark.yarn.log.aggregation.enable状态:若该参数开启,YARN会接管日志聚合流程,可能与自定义log4j的文件输出配置冲突,导致本地日志被强制截断。 - 检查容器日志目录权限:确认
spark.yarn.app.container.log.dir对应的目录权限是否正常,若容器进程无写入权限,可能导致日志写入失败后被截断为0字节。
三、容器运行时异常排查
- 排查容器内存溢出问题:查看NodeManager的nmLogs日志,搜索OOM相关报错,若容器内存不足导致日志进程(如log4j Appender)被Kill,会直接截断日志文件。
- 检查容器内日志工具配置:通过
yarn container -exec -containerId <容器ID> -nodeAddress <节点地址:端口>进入运行中容器,查看是否存在logrotate等工具的每分钟轮转配置,是否针对stderr/stdout做了强制截断。
四、日志聚合流程验证
- 检查HDFS聚合日志完整性:查看
yarn.nodemanager.remote-app-log-dir下的聚合日志,若聚合后的日志完整,说明问题出在本地日志的截断逻辑;若聚合日志也被截断,则是YARN聚合过程中触发了截断。 - 查看ResourceManager与NodeManager的聚合日志:搜索
log aggregation关键词,确认是否每分钟触发一次聚合操作,是否存在异常截断的日志信息。
内容的提问来源于stack exchange,提问作者Calypso
相关产品推荐
相关产品推荐

