EMR on EKS中Spark作业失败自动重试5次的配置排查与禁用咨询
解决EMR Spark作业自动重试5次的问题
核心原因:重试来自EMR Step的默认配置
你遇到的5次重试,本质是EMR Step的默认重试次数(EMR 5.x/6.x的Step默认都会重试5次),而非Spark自身的作业重试机制。下面分版本给出解决方案和调试步骤。
EMR 5.33.0版本:禁用重试的配置方法
要关闭Step的自动重试,提交作业时直接指定重试次数为1(maxAttempts=1代表仅运行一次,失败不再重试):
- AWS CLI提交:添加
--step-args '{"RetryPolicy":{"MaximumAttempts":1}}'参数,示例:aws emr add-steps --cluster-id <你的集群ID> --steps Type=Spark,Name=MyJob,Args=[--class,com.example.MyMain,--conf,spark.stage.maxConsecutiveAttempts=1,--conf,spark.task.maxFailures=1,s3://my-bucket/job.jar],ActionOnFailure=CONTINUE,RetryPolicy='{"MaximumAttempts":1}' - 控制台创建Step:在「Configure step」页面找到「Retry policy」,把「Maximum attempts」设为1
- boto3 SDK提交:在Step配置中加入RetryPolicy字段:
'RetryPolicy': { 'MaximumAttempts': 1 }
另外,为了彻底避免Spark自身的Stage/Task重试,加上这两个Spark配置:
spark.stage.maxConsecutiveAttempts=1 spark.task.maxFailures=1
可以通过--conf参数传入,或者在集群的spark-defaults.conf中全局配置。
EMR 6.9.0版本:配置无效的原因及修复
你之前参考的是EMR on EKS的文档,那个retryPolicyConfiguration只适用于EKS上的Job Run,不适用于EC2上的EMR集群Step,所以配置了也不会生效。
正确配置方式(EC2集群)
和EMR 5.x完全一致:提交Step时指定RetryPolicy.MaximumAttempts=1,同时加上Spark自身的重试关闭参数,具体参考上面的CLI/控制台/SDK示例。
调试步骤,确认问题根源
- 查EMR Step日志:在EMR控制台的Step详情页,打开「Logs」链接,搜索「Retrying step」,确认是不是Step层面的重试
- 查Spark日志:进入Spark Application Master的日志页面,搜索「Attempt」,看有没有Stage或Task级别的重试记录
- 验证配置是否生效:
- 用CLI查看Step配置:
aws emr describe-step --cluster-id <集群ID> --step-id <Step ID>,检查RetryPolicy.MaximumAttempts是否为1 - 打开Spark UI的「Environment」页面,确认
spark.stage.maxConsecutiveAttempts和spark.task.maxFailures的值是否为1
- 用CLI查看Step配置:
总结
无论EMR 5.x还是6.x(EC2集群),要彻底禁用重试,必须同时做两件事:
- 把EMR Step的重试次数设为1,解决Step层面的5次重试
- 关闭Spark自身的Stage/Task重试,避免作业内部的重试逻辑
内容的提问来源于stack exchange,提问作者hsnsd
相关产品推荐
相关产品推荐

