Spark任务遇Connection reset by peer异常,请求排查解决
Hey,从你遇到的问题来看,这个Connection reset by peer异常十有八九和节点间的网络通信超时或者连接中断有关——毕竟你说相同数据量在其他环境能跑,说明不是任务本身的逻辑问题,大概率是当前集群的配置或者网络环境的锅。下面给你几个针对性的排查和解决方向:
1. 先调大Spark网络超时相关参数
这个错误最常见的原因就是Executor和Driver之间的心跳超时、或者大数据传输时连接被截断。你可以在spark-submit里加上这些配置试试:
--conf spark.executor.heartbeatInterval=60s \ --conf spark.network.timeout=300s \ --conf spark.rpc.message.maxSize=256 \
spark.executor.heartbeatInterval:Executor给Driver发心跳的间隔,默认是10秒,长任务很容易因为GC或者任务繁忙错过心跳导致连接被断;spark.network.timeout:所有网络交互的总超时时间,默认是120秒,调长到5分钟能覆盖大部分慢任务;spark.rpc.message.maxSize:RPC消息的最大体积,默认是128MB,如果你的任务有大 shuffle 数据,这个值不够会导致消息被截断,直接引发连接重置。
2. 排查YARN集群的网络和资源限制
- 防火墙/网络带宽:确认集群节点之间的防火墙没有拦截Spark的随机通信端口,同时检查是否存在网络带宽瓶颈——比如某台节点的网卡负载过高,导致数据传一半就断了;
- YARN内存上限:检查YARN的
yarn.nodemanager.resource.memory-mb和yarn.scheduler.maximum-allocation-mb配置,确保你设置的spark.executor.memory + spark.yarn.executor.memoryOverhead(16G+1.6G=17.6G)没有超过单节点的内存分配上限。如果超过了,YARN会悄悄杀掉Executor,也会触发这种连接重置的错误。
3. 优化SQL阶段的执行逻辑(针对卡住的那个阶段)
虽然其他环境能跑,但当前环境的数据分布可能有差异:
- 检查数据倾斜:打开Spark UI看卡住的Stage,有没有少数Task处理的数据量是其他Task的几十倍?如果有,那就是数据倾斜导致这个Task跑太久,间接引发超时。可以试试给倾斜的分区键加盐,或者换个更均匀的分区字段;
- 调整广播连接阈值:你现在设置了
spark.sql.autoBroadcastJoinThreshold=-1完全关闭了广播连接,如果你的SQL里有大表和小表关联,强制不广播会导致大量shuffle数据在节点间传输,增加网络压力。可以把这个值调回1G(1073741824),让小表自动广播,减少网络传输量。
4. 调整动态分配和资源参数
你开启了动态分配,但初始Executor只有10,任务运行中可能出现Executor被YARN回收的情况,也会导致连接中断:
- 先试试关闭动态分配,固定Executor数量:
先排除动态分配带来的不稳定,确认任务能跑起来后再考虑开动态分配;--conf spark.dynamicAllocation.enabled=false \ --conf spark.executor.instances=20 \ - 调大
spark.yarn.executor.memoryOverhead:你现在设的是1638MB,对于16G的Executor内存来说,这个值偏低(建议是Executor内存的10%-20%,也就是1638-3276MB)。Overhead是给Off-Heap内存用的,如果不够,Executor可能会因为内存溢出被杀死,也会触发连接重置。
5. 给Driver多分配点资源
你的Driver内存只设了2G,对于需要管理几百个Task的长任务来说可能不够,容易出现GC停顿或者内存不足,导致无法及时响应Executor的心跳。可以调到4G试试:
--conf spark.driver.memory=4G \
按照上面的步骤逐步排查,大概率能解决这个问题~
内容的提问来源于stack exchange,提问作者philantrovert
相关产品推荐
相关产品推荐

