控制器发生异常 eofexception_0599-5.14.4-HDFS出现大量BrokenPipe异常处理

本文详细记录了HDFS DataNode节点出现大量'Broken Pipe'异常的故障分析和处理过程。从平台层面、网络层面、系统层面逐一排查,包括NameNode GC问题、内存使用、TCP内核参数、网络配置、系统语言环境等。最终,通过将系统语言环境更改为英文解决了问题。

作者:李继武&陶攀龙

1.故障描述

在HBase和Hive集群中HDFS的DataNode节点均有大量的异常日志,详细日志信息如下:

2019-02-25 17:02:02,153 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: BlockSender.sendChunks() exception: java.io.IOException: 断开的管道 at sun.nio.ch.FileChannelImpl.transferTo0(Native Method) at sun.nio.ch.FileChannelImpl.transferToDirectlyInternal(FileChannelImpl.java:416) at sun.nio.ch.FileChannelImpl.transferToDirectly(FileChannelImpl.java:481) at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:596) at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:223)...
922f8ed0d0983b427cf0868bbc9675ec.png

主要以Hive集群分析为主,该集群中有hive01和hive02两个节点即是管理节点也是数据节点,这两个节点上出现了大量的“Broken Pipe”异常日志

9087bfe9af9c070b05a08494946b1bbd.png
64c38be532a09f124e32c0d838ee34b6.png

2.故障分析阶段(平台层面)

通过提供给Cloudera售后的HDFS日志、lsof日志以及其它搜集的日志,在初步分析后反应出来的现象HBase出现性能问题是由于底层的HDFS不稳定导致。在HDFS的DataNode节点有大量的“Broken Pipe”异常,由于大量的Broken Pipe导致DataNode读写Block时重试从而导致基于HDFS的HBase等应用会出现性能下降的问题。

售后提出协调系统管理员分析系统层面的问题,在OS层面与旧集群未做任何变动,系统的参数及Hadoop的基本运行环境均与旧集群一致。

1. 通过分析Hive集群发现 NameNode GC频繁且耗时,如下图所示

a4bb4c75a2d12a9cc0a2413ebd2edbc7.png

将NameNode的Java heap大小从6GB调整至10GB

bff03f99941e7865c8310cf8c8116860.png

增加NameNode的Heap大小后通过jstat命令和CM监控界面进行监控,看到NameNo

`poplib.POP3_SSL` 出现 `-ERR EOF` 错误通常意味着连接意外关闭或者服务器提前结束了响应。以下是一些可能的解决方案: ### 1. 检查网络连接 不稳定的网络可能导致连接中断,从而引发 `-ERR EOF` 错误。需要确保网络连接稳定,可以尝试重新连接网络或者切换到其他网络环境。 ### 2. 检查服务器状态 服务器可能暂时不可用或者出现故障。可以访问邮件服务提供商的官方网站或者状态页面,查看是否有服务器维护或者故障通知。 ### 3. 检查授权码和账号信息 使用错误的授权码或者账号信息可能会导致连接被服务器拒绝。确保使用的是正确的授权码而不是邮箱密码,因为部分邮箱服务要求使用授权码进行登录。例如,直接用 QQ 密码用作 `password` 会提示 `poplib.error_proto: -ERR Please using authorized code to login` [^1]。 ### 4. 检查代码逻辑 确保代码中没有意外关闭连接或者在连接未建立时进行操作。以下是一个示例代码,展示了如何正确使用 `poplib.POP3_SSL` 进行邮箱登录: ```python import poplib def mail_login(): email_account = "your_email@example.com" # 授权码 password = "your_authorization_code" pop3_server = "pop.example.com" try: # 连接到POP3服务器 server = poplib.POP3_SSL(pop3_server) server.set_debuglevel(1) # 打印欢迎信息 print(server.getwelcome().decode("utf-8")) # 发送用户名 server.user(email_account) # 发送授权码 server.pass_(password) print("登录成功") # 关闭连接 server.quit() except poplib.error_proto as e: print(f"登录失败: {e}") except Exception as e: print(f"发生未知错误: {e}") mail_login() ``` ### 5. 增加超时设置 在创建 `poplib.POP3_SSL` 对象时,可以增加超时设置,避免长时间等待无响应的连接。示例如下: ```python import poplib email_account = "your_email@example.com" password = "your_authorization_code" pop3_server = "pop.example.com" try: # 增加超时设置 server = poplib.POP3_SSL(pop3_server, timeout=10) server.set_debuglevel(1) server.user(email_account) server.pass_(password) print("登录成功") server.quit() except poplib.error_proto as e: print(f"登录失败: {e}") except Exception as e: print(f"发生未知错误: {e}") ``` ### 6. 检查防火墙和安全软件 防火墙或者安全软件可能会阻止与邮件服务器的连接。可以临时禁用防火墙或者安全软件,然后再次尝试连接。如果问题解决,则需要配置防火墙或者安全软件允许与邮件服务器的通信。 ### 7. 更新 Python 版本和相关库 确保使用的是最新版本的 Python 和 `poplib` 模块。旧版本的 Python 或者库可能存在已知的 bug,更新到最新版本可能会解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值