Dataproc中Spark Streaming作业RetryUpToMaximumCountWithFixedSleep异常问题
解决方案与问题分析
一、调整RetryUpToMaximumCountWithFixedSleep重试次数为2
RetryUpToMaximumCountWithFixedSleep是Spark内部默认的重试策略,覆盖RPC通信、组件连接等场景。要将重试次数改为2,按以下方式配置:
- spark-submit命令行:
其中spark-submit --conf spark.rpc.numRetries=2 --conf spark.rpc.retry.wait=1000 [其他作业参数]spark.rpc.numRetries控制最大重试次数,spark.rpc.retry.wait为每次重试间隔(单位毫秒,默认1000)。 - Dataproc控制台提交:在作业配置的「Spark属性」中添加两组键值对:
- 键:
spark.rpc.numRetries,值:2 - 键:
spark.rpc.retry.wait,值:1000(可选,保持默认也可)
- 键:
如果重试针对特定数据源(如Kafka、HDFS),需额外调整对应组件参数:
- HDFS客户端重试:添加
--conf dfs.client.retry.max.retries=2 - Kafka消费者重试:在代码的消费者配置中设置
retries=2
二、让作业在集群故障时直接失败
要避免作业挂起,确保集群停止后快速失败,结合以下配置:
- 缩短心跳超时,快速检测Executor离线:
--conf spark.network.timeout=30s --conf spark.executor.heartbeatInterval=5sspark.network.timeout设置所有网络操作超时时间,spark.executor.heartbeatInterval为Executor向Driver发送心跳的间隔。 - 禁用作业自动重试:
限制作业最大尝试次数为1,失败后不再自动重启。--conf spark.yarn.maxAppAttempts=1 - 关闭Streaming优雅停机:
让Spark Streaming在检测到故障时直接终止,不等待数据处理完成。--conf spark.streaming.stopGracefullyOnShutdown=false --conf spark.streaming.backpressure.enabled=false
三、重试未达次数就挂起的原因
- 线程阻塞导致重试逻辑停滞:集群突然停止时,作业线程可能阻塞在未设置超时的IO操作(如TCP连接等待、文件系统读取),操作系统未抛出超时异常,重试循环无法进入下一次计数。例如Driver连接已下线的Executor,TCP连接处于
SYN_SENT状态且无超时设置,线程永久阻塞。 - Driver进程僵死:集群停止时,Dataproc强制回收Driver节点资源,但进程未被完全杀死,处于僵死状态,无法继续执行重试计数,控制台因此仍显示"running"。
- 控制台状态更新延迟:Dataproc作业状态依赖YARN/Spark的状态上报,集群故障时上报通道中断,控制台无法及时更新为"failed",实际作业已停止响应。
- 重试策略作用范围有限:RetryUpToMaximumCountWithFixedSleep仅覆盖特定组件(如RPC)的重试,若作业挂起因其他未被覆盖的阻塞操作,重试计数不会递增。
内容的提问来源于stack exchange,提问作者Harikrishnan Balachandran
相关产品推荐
相关产品推荐

