问题描述
2021-09-09 23:01:00.202 [] ERROR o.a.h.h.c.AsyncProcess - Failed to get region location org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=32, exceptions: <br> Thu Sep 09 23:01:00 CST 2021, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=68246: row 'marketing:T_TYNY_URL_INFO,4191i,99999999999999' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=dz-hbase-dn5,60020,1616397186386, seqNum=0 at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.throwEnrichedException(RpcRetryingCallerWithReadReplicas.java:276)
hbase 服务端版本HBase 1.2.0-cdh5.15.2, java api调用hbase读写操作卡死, 重试32次之后抛出异常。这是最近遇到的一个非常坑的一个问题,从问题发现到最终解决问题花费了很长时间。
- 测试环境集群版本和生产集群版本一样,原先技术选型直接用的 spring-data-hadoop-hbase,其实这个隐藏了一个bug一直没有修复,因为我们知道hbase获取链接耗费的时间非常长,一般connection只需要连接一次,spring封装的api每次都需要连接。(原因没有深入了解)。
- 那就用hbase-client原生api吧,很多Google版本冲突也搞得人很崩溃。
- google一下发现有一个集成的包hbase-shaded-client 将所有hbase-client的依赖重命名打包成自己的依赖。验证可用。
- 测试环境验证OK,但是发布到生产环境验证,崩溃了就出现上面假死的现象,一直卡住不动,直到最后抛出异常broken pipe
问题定位
从客户端报错和服务报错信息很少,看不出来什么原因,排除法
- 生产hadoop 集群问题,线上其他应用正常,排除
- 本地hosts的映射配置,也可以排除。因为我们用kerbs登录正常,日志也有打印,排除
- 客户端端口权限问题,排除,因为telnet 域名:端口号 响应正常
- 防火墙排查没有问题
- 没有办法只能部署一个客户端,发现客户端访问hbase集群是可以读写的,证明集群和配置没有问题
- 都没有问题,那就只能是程序的问题了,版本不一致导致,生产上版本是HBase 1.2.0-cdh5.15.2, 我的应用是 hbase-shaded-client 1.2.0 。
- 封装最简单的jar包应用打包上传到服务器验证, 果然一样报错。