记录一次定位spark shuffle总是报connection reset by peer的问题

问题描述:spark使用dynamicAllocation模式,开启external shuffle service,并且yarn上也正常起了spark-shuffle service ,在shuffle过程中,executor总是报connection reset by peer异常,导致拉取shuffle数据失败,任务失败。

尝试了以下措施:

1. spark.shuffle.blockTransferService=nio

2. 怀疑是服务器最大打开文件数达到上限,导致socket拒绝连接,通过ulimit -a 查看最大文件打开数为65536

3. 调大nodemanager启动内存为2g(很早就意识到应该从nodemnager找原因)

4. 服务器开启jstatd,然后用jvisualvm监控,没有发现内存溢出或内存耗尽的情况,看gc曲线也正常

5. jstat -gccause为发现fullgc

6. 减少executor数量上限为6,以为是连接数过多导致

试了以上方法都没有作用,

后来通过查看nodemanager日志才定位到原因,原来是netty包版本与spark shuffle使用的netty包版本冲突,导致spark shuffle服务的线程报NoSuchMethodError,进而关闭连接,所以executor端收到connection reset by peer异常,通过替换netty包解决,将spark jars目录下的netty包拷到nodemanager的lib目录下,注意hdp有hadoop的lib目录和yarn的lib目录,两个都要替换最后问题解决。

总结:定位问题思路真的很重要,有问题不要急着胡乱搞一通,没有思路可以静下来想一想,思考问题可能出现的环节,连接重置其实很简单,无非就是连接两端的问题,找到两端跟连接相关的进程进行定位,主要通过查看日志。对于各种超时的情况很有可能是内存耗尽,jvm长时间fullgc导致,尤其对于分布式应用一般会使用心跳机制检测存活。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Connection reset by peer表示在使用WebSocket协议时,客户端和服务器之间的连接被远程主机强制关闭。这种情况通常发生在对方主动关闭连接或者网络中断的情况下。 在给出解决方案之前,我们需要先了解一些与此问题相关的信息。根据引用,TCP发送保活探测消息以确定连接是否已断开的次数。默认情况下,该值为9次。如果在给定次数内未收到对方的响应,则会认为连接已断开,并且会告"Connection reset by peer"错误。 解决此问题的一种常见方法是调整TCP的保活探测相关参数。您可以尝试以下操作来解决这个问题: 1. 增加tcp_keepalive_intvl(TCP发送保活探测消息的间隔时间)和tcp_keepalive_probes(发送保活探测消息的次数)的值。通过增加这些值,可以使操作系统更长时间地等待对方响应,从而减少出现"Connection reset by peer"错误的可能性。请参考引用中的相关资料以了解如何进行相应的设置。 2. 检查您的网络连接是否稳定。网络中的不稳定性也可能导致连接被重置。您可以通过检查网络设备、使用其他网络连接或与您的网络管理员联系来解决这个问题。 3. 检查服务器端和客户端的日志文件,查看是否有其他相关错误或警告信息。这些信息可能有助于确定问题的根本原因,并提供更具体的解决方案。 请注意,以上解决方案仅供参考。具体的解决方法可能因系统配置、网络环境和具体情况而有所不同。如果以上方法无法解决您的问题,请根据引用中提供的更具体解决方案进行进一步的排查和处理。 https://quote1.com https://quote2.com https://quote3.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值