记一次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>好的,我现在需要帮助用户解决他们在HBase安装过程中遇到的问题。根据用户提供的日志,他们在执行`hbase.cmd`时出现了使用提示,而没有成功启动HBase服务。用户可能不太清楚如何正确使用这些命令,特别是如何启动HMaster或RegionServer。 首先,我需要回顾之前的对话历史,确保我的回答与之前的指导一致。之前的指南中,用户被引导到HBase的bin目录下执行`hbase.cmd start`来启动服务。然而,用户现在直接运行`hbase.cmd`,导致输出了命令列表,而不是启动服务。这可能意味着用户没有正确输入启动命令,或者可能存在其他配置问题。 接下来,我需要分析用户提供的错误信息。用户输入的是`PS D:\hbase-2.4.11\bin> .\hbase.cmd`,而正确的启动命令应该是`hbase.cmd start`。因此,用户可能漏掉了`start`参数,导致HBase只是显示帮助信息而没有启动服务。这是最常见的问题之一,特别是对于新用户来说,可能会忽略必要的参数。 另外,我还需要检查用户是否按照之前的步骤正确配置了环境变量和依赖项。例如,Java环境变量是否正确设置,Hadoop的winutils和dll文件是否放置正确,以及HBase的配置文件是否有误。用户可能遇到了环境配置问题,例如JAVA_HOME未正确设置,或者Hadoop组件缺失,导致HBase无法启动。 此外,用户可能在启动HBase时遇到了端口冲突,或者文件权限问题,这也会导致服务启动失败。需要提醒用户检查端口占用情况,并确保有足够的权限访问相关目录。 在回答中,我需要分步骤指导用户正确输入命令,并验证他们的配置是否正确。同时,要提供常见问题的解决方法,帮助用户排查可能遇到的错误,例如检查日志文件,确认Java版本兼容性,以及确保Hadoop依赖项的存在。 最后,确保回答结构清晰,语言简洁,避免技术术语过多,方便用户理解和跟随操作步骤。需要强调正确使用命令参数的重要性,并提供验证服务是否成功启动的方法,例如访问Web UI或检查日志。</think>以下是针对你执行 `hbase.cmd` 后显示命令列表的详细解释与操作指导: --- ### **一、问题分析** 你直接运行了 `hbase.cmd` 但未添加子命令,因此系统输出了所有可用的命令选项。要启动HBase服务或执行操作,需在 `hbase.cmd` 后附加具体命令(如 `start`、`shell` 等)。 --- ### **二、核心命令说明** #### 1. **启动HBase服务** - 启动HMaster(主节点)和RegionServer(区域服务器): ```cmd .\hbase.cmd start ``` - 成功启动后,会显示 `HMaster` 和 `HRegionServer` 进程信息。 - 验证服务: - 访问Web UI:`http://localhost:16010` - 检查日志文件:`D:\hbase-2.4.11\logs\hbase-*.log` #### 2. **进入HBase Shell(交互式命令行)** - 执行以下命令启动HBase Shell: ```cmd .\hbase.cmd shell ``` - 进入后可以操作HBase数据库,例如: ```shell create 'test_table', 'cf' # 创建表 list # 查看所有表 ``` #### 3. **其他常用命令** - 启动ZooKeeper(独立模式): ```cmd .\hbase.cmd zookeeper ``` - 查看版本信息: ```cmd .\hbase.cmd version ``` --- ### **三、操作示例** #### **场景:单机模式启动并测试** 1. **启动HBase服务**: ```cmd .\hbase.cmd start ``` - 若输出 `Master is running` 且无报错,则启动成功。 2. **进入Shell操作**: ```cmd .\hbase.cmd shell ``` - 创建表并插入数据: ```shell create 'user', 'details' put 'user', 'row1', 'details:name', 'John' scan 'user' ``` 3. **关闭服务**: - 在Shell外按 `Ctrl+C` 终止服务进程,或直接关闭命令行窗口。 --- ### **四、常见错误排查** #### 1. **启动失败:`JAVA_HOME not set`** - **解决**:检查 `conf\hbase-env.cmd` 中 `JAVA_HOME` 路径是否指向JDK安装目录(如 `C:\Program Files\Java\jdk1.8.0_301`)。 #### 2. **端口冲突** - **现象**:`Address already in use` - **解决**: 1. 修改 `conf\hbase-site.xml` 中的端口号: ```xml <property> <name>hbase.master.port</name> <value>16000</value> <!-- 替换为未占用端口 --> </property> ``` #### 3. **Hadoop依赖缺失** - **现象**:`java.io.IOException: Could not locate executable null\bin\winutils.exe` - **解决**: - 确保已下载 `winutils.exe` 和 `hadoop.dll`,并配置 `HADOOP_HOME` 环境变量指向其父目录(如 `C:\hadoop`)。 --- ### **五、注意事项** - **路径规范**:HBase路径中避免使用空格(如 `Program Files` 可能引发问题)。 - **版本兼容**:HBase 2.4.x 需搭配JDK 8或11,更高版本JDK可能不兼容。 --- 通过上述步骤,可正确使用 `hbase.cmd` 命令操作HBase。若仍有问题,请提供具体报错信息进一步分析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值