记一次Thrift Server错误排查

1. 起因

1.1. 昨夜下班回家后11点左右突然收到hbase监控的连接失败邮件。
1.2. 上线查看监控日志,发现均是timeout异常
1.3. 查看消费者日志,发现所有连接不可用,不断重试中,遂关闭所有消费者

2. 进一步排查

2.1. 早上九点到公司开始继续排查问题
2.2. 查看hbase thrift 日志,发现大量重试,发现thrift处理线程已满,大量等待任务
$ tail -n 1000 hbase-hbase-thrift2-idc02-argo-ds-743.log
2017-02-21 09:50:40,578 ERROR [pool-1-thread-49085] thrift.ProcessFunction: Internal error processing get
java.lang.RuntimeException: java.util.concurrent.RejectedExecutionException: Task org.apache.hadoop.hbase.util.BoundedCompletionService$QueueingFuture@6d8d5d1d rejected from java.util.concurrent.ThreadPoolExecutor@42d2ee91[Running, pool size = 256, active threads = 256, queued tasks = 25600, completed tasks = 37016]
......
Caused by: java.util.concurrent.RejectedExecutionException: Task org.apache.hadoop.hbase.util.BoundedCompletionService$QueueingFuture@6d8d5d1d rejected from java.util.concurrent.ThreadPoolExecutor@42d2ee91[Running, pool size = 256, active threads = 256, queued tasks = 25600, completed tasks = 37016]
......
2017-02-21 10:01:49,958 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=26, retries=35, started=432112 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:02:10,155 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=27, retries=35, started=452309 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:02:30,189 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=28, retries=35, started=472343 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:02:50,386 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=29, retries=35, started=492540 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:03:10,495 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=30, retries=35, started=512649 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:03:30,689 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=31, retries=35, started=532843 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:03:50,717 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=32, retries=35, started=552871 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:04:10,829 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=33, retries=35, started=572983 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2017-02-21 10:04:30,857 INFO  [pool-1-thread-49843] client.RpcRetryingCaller: Call exception, tries=34, retries=35, started=593011 ms ago, cancelled=false, msg=row '536051594396' on table 'resys:taobao_comment' at null
2.3. 查看服务器TCP连接发现大量CLOSE_WAIT连接
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 29
CLOSE_WAIT 16440
FIN_WAIT1 13
ESTABLISHED 62

3. 分析问题

  1. 客户端请求过多,导致服务器线程池无法处理,一部分请求直接处于等待完成状态。此时客户端由于设置timeout,于是超时后放弃连接并起新的连接。由于服务器还在处理其他任务,导致之前的连接无法正常close,于是这部分连接处于CLOSE_WAIT状态。
  2. 通过日志发现thrift自己本身会对请求失败的任务不断重试,并且重试次数高达35次,这也导致了处理速度过慢
  3. 服务器大量的CLOSE_WAIT说明系统CLOSE_WAIT设置时间过长

4. 解决问题

  1. 减少系统CLOSE_WAIT时间(不建议,影响过大
  2. 去除客户端timeout超时等待(可行,虽然看起来不优雅
  3. 减少thrift自己重试次数,并增加thrift线程池内线程数
<think>好的,用户现在遇到了另一个Hive相关的错误,具体是“Unknown HS2 problem when communicating with Thrift server”和“Broken pipe (Write failed)”。我需要先理解这个错误的背景和可能的原因。首先,HS2指的是HiveServer2,而Thrift是Hive用于客户端通信的协议。所以问题出现在客户端与HiveServer2之间的通信过程中。 错误信息中的“Broken pipe”通常意味着在写入数据时,连接的另一端已经关闭了连接。这种情况可能由多种因素引起。我需要考虑常见的可能性,比如网络问题、服务器端的问题(如HiveServer2崩溃或重启)、客户端超时设置不当,或者是查询执行时间过长导致连接被中断。 接下来,我需要整理这些可能的原因,并给出对应的解决方案。用户可能需要检查网络连接是否稳定,确认HiveServer2服务是否正常运行,查看是否有相关的日志信息,以及调整客户端的超时参数。此外,资源不足(如内存或CPU过载)也可能导致服务不稳定,从而引发此类错误。 另外,用户可能没有意识到客户端和服务器的版本兼容性问题,或者Thrift协议的配置问题,这些都需要考虑进去。还要注意是否有防火墙或安全组设置阻止了通信,或者是操作系统层面的限制,如文件描述符不足等。 在回答时,需要分步骤引导用户进行排查,从最简单的网络检查开始,逐步深入到服务器状态、日志分析、配置调整等。同时,提供具体的命令示例,比如如何查看HiveServer2日志,如何调整超时设置,以及如何测试网络连通性,这样用户可以直接操作。 还要考虑用户的技术背景,可能不是非常熟悉Hive的内部机制,所以需要用通俗易懂的语言解释每个步骤的目的和操作方法。此外,扩展知识部分可以比较不同超时参数的作用,帮助用户理解调整这些参数的意义。 最后,需要提醒用户如果自行排查无法解决问题,应提供更多上下文信息或日志以便进一步分析,这有助于用户意识到可能需要收集更多数据来定位问题。</think>### **问题分析** 您遇到的错误表明客户端与 HiveServer2(HS2)的 Thrift 服务通信时发生连接中断(`Broken pipe`)。错误关键点: > `TTransportException: java.net.SocketException: Broken pipe (Write failed)` 此错误通常由**客户端与服务端的长连接意外终止**导致。 --- ### **原因诊断** #### 1. **网络或服务端问题** - **网络不稳定**:客户端与 HiveServer2 之间的网络连接中断 - **HiveServer2 崩溃/重启**:服务端进程意外终止或主动重启 - **资源不足**:HiveServer2 所在节点内存/CPU 过载,导致服务无响应 #### 2. **客户端超时配置不当** - 客户端操作(如查询执行)耗时过长,超过服务端或客户端的**空闲超时阈值** - 常见超时参数: - `hive.server2.session.check.interval`(服务端会话检查间隔) - `hive.server2.idle.session.timeout`(服务端空闲会话超时时间) - `socket.timeout`(客户端 Socket 超时时间) #### 3. **Thrift 协议限制** - Thrift 默认使用单线程处理请求,高并发场景下可能引发阻塞 - 大结果集传输时未分页,导致通信超时或内存溢出 --- ### **解决方案** #### 步骤 1:基础检查 1. **验证网络连通性** ```bash # 检查 HiveServer2 端口(默认 10000)是否可达 telnet <hiveserver2_host> 10000 # 或使用 netcat nc -zv <hiveserver2_host> 10000 ``` 2. **确认 HiveServer2 服务状态** ```bash # 查看 HiveServer2 进程 ps -ef | grep HiveServer2 # 检查日志(默认路径:/var/log/hive/hiveserver2.log) tail -f /var/log/hive/hiveserver2.log ``` #### 步骤 2:调整超时参数 1. **客户端配置** - 在 JDBC 连接字符串或客户端配置中增加超时参数: ```bash # JDBC 示例(Beeline/JDBC) jdbc:hive2://<host>:10000/default; socketTimeout=60000; transportMode=http;httpPath=cliservice ``` - 关键参数: - `socketTimeout=60000`(Socket 超时时间,单位毫秒) - `queryTimeout=3600`(查询超时时间,单位秒) 2. **服务端配置** 在 `hive-site.xml` 中调整: ```xml <!-- 空闲会话超时时间(默认 1h,单位毫秒) --> <property> <name>hive.server2.idle.session.timeout</name> <value>3600000</value> </property> <!-- 会话检查间隔(默认 15min,单位毫秒) --> <property> <name>hive.server2.session.check.interval</name> <value>900000</value> </property> ``` #### 步骤 3:优化 Thrift 通信 1. **启用分页查询** ```sql -- 限制返回结果集大小(默认关闭) SET hive.cli.print.row.count=1000; ``` 2. **使用 HTTP 模式替代二进制传输** ```bash # Beeline 连接时指定 HTTP 模式 !connect jdbc:hive2://<host>:10000/default; transportMode=http; httpPath=cliservice ``` --- ### **扩展知识:关键参数对比** | 参数名称 | 默认值 | 作用域 | 说明 | |---------------------------------------|-------------|--------------|----------------------------------------------------------------------| | `socketTimeout` | 10s | 客户端 | 客户端等待响应的超时时间 | | `hive.server2.idle.session.timeout` | 1h | 服务端 | 自动关闭空闲会话的阈值 | | `hive.server2.session.check.interval` | 15min | 服务端 | 检查会话状态的频率 | | `hive.server2.thrift.max.worker.threads` | 500 | 服务端 | Thrift 服务最大工作线程数(高并发场景需调高) | --- ### **注意事项** 1. **资源监控** - 使用 `top`、`htop` 或 `jstat` 监控 HiveServer2 进程的 CPU/内存使用情况 2. **日志分析** - 关注 `hiveserver2.log` 中 `ERROR` 或 `WARN` 级别的日志,定位具体异常栈 3. **防火墙规则** - 确保客户端与 HiveServer2 之间的端口(如 10000)未被防火墙阻断 --- 若上述方法仍无法解决,建议提供以下信息以便进一步排查: - Hive 版本(`hive --version`) - 完整的客户端报错日志 - HiveServer2 日志中相关时间段的错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值