Yarn显示作业成功但EMR步骤持续运行问题求助
这种状态不一致的情况确实很棘手,结合我处理EMR和Spark/Yarn集群的经验,给你几个具体的排查和解决方向:
先明确两者的状态判定逻辑差异
Yarn标记作业成功是基于ApplicationMaster(AM)的状态——只要AM正常退出(比如计算任务全部完成后主动停止),Yarn就会把应用标记为成功。但EMR的步骤状态是绑定驱动进程的,只有驱动进程彻底退出,EMR才会把步骤标记为完成。所以核心矛盾可能是:AM已经退出,但驱动进程还在执行收尾操作,没主动终止。检查驱动程序的收尾逻辑
你提到在写JSON分片到S3,很可能是驱动在计算任务完成后,还在执行异步的IO操作(比如后台上传S3文件、合并分片),但没有主动终止进程。如果是Spark作业,一定要确保在所有任务完成后调用spark.stop(),这会彻底终止驱动进程;如果是普通Java/Scala程序,要在收尾逻辑结束后调用System.exit(0)主动退出。另外,检查是否有线程泄漏——比如创建了后台线程但没正确关闭,导致驱动进程一直挂着。对比EMR步骤日志和Yarn应用日志
- 去EMR控制台的步骤详情页,查看步骤的
stderr和stdout日志,找驱动进程是否有卡住的迹象:比如死循环、等待某个资源、未处理的异常(但没抛出到顶层导致进程退出)。 - 查看Yarn的ApplicationMaster日志(可以通过EMR控制台的Yarn UI进入),确认AM退出的原因是正常完成还是异常终止,对比AM退出时间和驱动日志中后续操作的时间线,判断是不是AM提前退出了。
- 去EMR控制台的步骤详情页,查看步骤的
排查S3写入的异常
写入JSON分片到S3时,可能出现IO阻塞的情况:比如网络波动导致S3请求超时、重试次数过多,驱动进程一直卡在等待IO完成。检查驱动日志中关于S3写入的部分,有没有超时报错、重试日志;也可以用aws s3 ls <你的S3路径>命令检查分片文件是否都成功写入,有没有大小异常(比如0字节)的文件——如果有未完成的文件,说明驱动可能一直在等待写入完成。检查EMR步骤的配置
确认EMR步骤的配置是否正确:比如是否设置了错误的退出条件,或者开启了某些保持进程存活的配置。EMR步骤默认是等待驱动进程退出才会标记完成,如果驱动进程因为某些原因变成了后台进程(比如通过nohup启动),EMR就会一直处于等待状态。另外,检查步骤的ActionOnFailure配置是否影响了状态更新,但这种情况一般不会导致一直运行。
内容的提问来源于stack exchange,提问作者user3407267

