EMR任务节点Shuffle日志占满磁盘:任务异常终止原因排查
EMR 6.9 Spark 3任务磁盘占用攀升及异常终止问题分析
问题现象
- 在EMR 6.9集群运行持续Spark 3任务,节点磁盘使用率随时间逐步上升
- 任务节点捕获到YARN容器监控警告日志:
2023-04-12 22:02:45,532 WARN org.apache.hadoop.yarn.util.ProcfsBasedProcessTree (Container Monitor): Error reading the stream java.io.IOException: No such process at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(FileInputStream.java:255) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) at java.io.BufferedReader.readLine(BufferedReader.java:389) at org.apache.hadoop.yarn.util.ProcfsBasedProcessTree.constructProcessInfo(ProcfsBasedProcessTree.java:531) at org.apache.hadoop.yarn.util.ProcfsBasedProcessTree.updateProcessTree(ProcfsBasedProcessTree.java:211) at org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl$MonitoringThread.run(ContainersMonitorImpl.java:537)
- 任务终止后遗留Shuffle日志,重启任务可降低磁盘使用率
异常终止及磁盘占用原因分析
1. YARN监控日志错误的直接原因
日志中的No such process错误,是YARN的ProcfsBasedProcessTree组件尝试读取进程信息时,目标Executor进程已意外退出,但监控线程仍在追踪该进程的资源使用情况,从而抛出异常。
2. 导致Executor意外退出及Shuffle日志遗留的核心原因
- Executor内存溢出(OOM):处理大数据集时,Executor堆内存或堆外内存不足,触发JVM OOM Killer强制终止进程。进程突然退出后,Spark的Shuffle文件清理逻辑未正常执行,导致数据残留。
- YARN资源阈值触发的进程终止:集群资源紧张时,YARN NodeManager会因容器内存/CPU超出预设阈值,直接杀死Executor进程。这种强制终止同样会打断Shuffle清理流程。
- Shuffle清理配置不合理:若未启用
spark.shuffle.service.enabled,或spark.shuffle.cleaner.interval等清理参数设置过长,Shuffle文件无法及时被回收,即使任务正常终止也可能残留。 - EMR 6.9版本兼容性bug:该版本集成的Spark 3与Hadoop YARN可能存在进程监控或Shuffle管理的已知bug,导致进程终止后清理逻辑失效。
3. 磁盘使用率攀升的根本原因
任务异常终止后遗留的Shuffle日志持续占用磁盘,加上持续运行的任务不断产生新的Shuffle数据,旧数据无法被回收,最终导致磁盘使用率逐步上升。重启任务会触发Spark初始化清理逻辑,清除之前遗留的Shuffle文件,因此磁盘使用率下降。
排查与优化建议
- 查看Executor日志(路径通常为
/var/log/hadoop/yarn/userlogs),确认是否存在OOM或其他进程终止的明确报错。 - 调整Spark资源配置:增大
spark.executor.memory,合理设置spark.executor.memoryOverhead比例,避免内存溢出。 - 启用YARN Shuffle Service:设置
spark.shuffle.service.enabled=true,由YARN统一管理Shuffle文件生命周期,即使Executor意外退出也能正常清理。 - 优化Shuffle清理参数:缩短
spark.shuffle.cleaner.interval,启用spark.cleaner.referenceTracking.cleanCheckpoints,确保过期Shuffle文件及时回收。 - 查阅EMR 6.9版本发布说明,确认是否存在相关已知bug,必要时升级至更高版本的EMR集群。
内容的提问来源于stack exchange,提问作者blue01
相关产品推荐
相关产品推荐

