Kerberos认证的HBase查询挂起问题排查求助
排查Kerberos认证HBase时Web服务器挂起的问题
我之前处理过好几起类似的Kerberos+HBase调用挂起的问题,大概率是认证流程或者配置细节出了岔子,咱们一步步来排查:
1. 先确认Kerberos票据的有效性
虽然你已经用kinit启动了Web服务器,但还是要确认票据是否真的能用于HBase认证:
- 执行
klist命令查看缓存的票据,检查是否存在对应HBase服务的principal(格式一般是hbase/<集群节点主机名>@你的Kerberos域),并且票据未过期 - 建议换成keytab方式获取票据(测试环境也能用),避免交互式
kinit可能带来的会话问题:kinit -kt /path/to/你的用户keytab 文件 你的用户名@KERBEROS_REALM
2. 强制开启调试日志,定位挂起环节
挂起无报错最头疼,开启Kerberos和HBase客户端的调试日志,能直接看到卡在哪个步骤:
- 启动Web服务器时添加以下JVM参数:
-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true -Dhbase.client.log.level=DEBUG - 查看日志重点关注:是否成功获取Kerberos票据、是否能解析HBase集群节点、是否发起了认证请求但无响应
3. 检查HBase配置是否正确加载
runAs方式失效,很可能是HBase的安全配置没生效:
- 确保
hbase-site.xml已经放到Web服务器的classpath中(比如WEB-INF/lib或者resources目录) - 重点检查这几个配置项:
<property> <name>hbase.security.authentication</name> <value>kerberos</value> </property> <property> <name>hbase.master.kerberos.principal</name> <value>hbase/master.yourdomain.com@YOUR_REALM</value> </property> <property> <name>hbase.regionserver.kerberos.principal</name> <value>hbase/regionserver.yourdomain.com@YOUR_REALM</value> </property>
4. 确认runAs的实现逻辑没问题
很多人用runAs时会犯一个错误:在特权块外初始化HBase连接。正确的做法是所有HBase相关操作都要放在UserGroupInformation.doAs()的特权代码块内:
// 先获取Kerberos身份的UGI实例 UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("your-user@YOUR_REALM", "/path/to/your-user.keytab"); // 把所有HBase操作包在doAs里 ugi.doAs(new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { // 这里创建连接、获取表、执行get操作 Configuration conf = HBaseConfiguration.create(); try (Connection conn = ConnectionFactory.createConnection(conf); Table table = conn.getTable(TableName.valueOf("your-table-name"))) { Get get = new Get(Bytes.toBytes("target-row-key")); Result result = table.get(get); // 处理查询结果 } return null; } });
- 注意:不要在doAs块外初始化Connection或Table对象,否则身份不会生效
5. 排查网络与DNS问题
Kerberos和HBase对网络和DNS的要求很高,很容易因为解析问题卡住:
- 测试Web服务器到HBase Master、RegionServer的端口连通性(默认Master是60000,RegionServer是60020),用
telnet <节点IP> <端口>或者nc -zv <节点IP> <端口>验证 - 检查正向/反向DNS解析:执行
nslookup <HBase节点主机名>和nslookup <节点IP>,确保两者能对应上;如果解析有问题,直接在Web服务器的/etc/hosts里添加节点的IP和主机名映射
6. 验证客户端与集群版本兼容性
Cloudera的HBase有定制化修改,版本不匹配会导致各种奇怪问题:
- 确保Web服务器用的HBase客户端jar包版本和Cloudera集群的HBase版本完全一致(比如CDH 6.3.2对应HBase 2.1.0-cdh6.3.2)
- 不要混用不同版本的HBase依赖,比如同时引入apache官方版和Cloudera定制版的jar
如果按上面的步骤排查后还是有问题,把调试日志里的关键片段贴出来,就能更精准定位了。
内容的提问来源于stack exchange,提问作者frollo
相关产品推荐
相关产品推荐

