Spark作业完成后Yarn显示已结束EMR步骤仍运行的间歇性问题咨询
EMR步骤状态与Yarn作业状态不同步排查方案
1 排查EMR步骤执行日志
- 登录EMR主节点,进入步骤日志目录
/var/log/emr/step/,找到对应异常步骤的stdout、stderr日志,确认是否存在进程残留、命令挂起的问题 - 核对Spark作业的提交逻辑:如果是将
spark-submit封装到自定义脚本中作为EMR步骤提交,检查脚本在Spark作业返回结果后,是否还有阻塞类的后续逻辑(例如批量日志上报、资源清理超时)未执行完成
2 验证Spark作业退出状态传递链路
- 检查Spark作业代码逻辑,确认SparkContext/SparkSession在作业执行完毕后正常调用
stop()方法,无僵尸进程或非守护线程阻塞JVM退出 - 可在作业逻辑末尾主动添加
System.exit(0)语句强制进程退出,避免线程阻塞导致作业进程无法正常结束
3 检查EMR集群与控制面的状态同步能力
- 执行命令
sudo systemctl status emr-step-agent确认主节点上的step-agent服务运行正常 - 查看step-agent日志
/var/log/emr/step-agent/step-agent.log,排查是否存在控制面接口调用超时、报错的记录,偶发异常大概率和网络波动导致状态上报失败相关 - 确认主节点绑定的IAM角色具备
emr:UpdateStepState权限,无权限限制导致状态无法同步到EMR控制台
4 确认组件版本兼容性
- 你使用的Hadoop Client 3.2.0如果和EMR集群内置的Hadoop版本不一致,可能导致S3写入完成后客户端后台线程残留,无法正常退出
- Spark 3.1.2存在作业完成后上下文清理不彻底的已知问题,可添加以下Spark配置优化退出逻辑:
spark.cleaner.referenceTracking.cleanCheckpoints=truespark.driver.stop.shutdownHookTimeout=30s
5 复现与规避方案
- 提交EMR步骤时配置合理的超时时间,避免异常步骤长期挂起占用集群资源
- 偶发场景下可通过循环提交轻量测试作业复现问题,复现时同步抓取主节点进程栈、step-agent日志定位具体阻塞点
内容的提问来源于stack exchange,提问作者Srav
相关产品推荐
相关产品推荐

