我启用Kerberos来保护hadoop并为主要test@EXAMPLE.COM生成密钥选项卡,并在我执行时使用hbase shell -grant命令提供测试用户RX(读执行)权限 kinit -k -t test.keytab test@EXAMPLE.COM
一切正常。我正在尝试使用以下代码通过Java代码/ Java客户端读表来做同样的事情
System.setProperty("java.security.krb5.realm", "EXAMPLE.COM");
System.setProperty("java.security.krb5.kdc", "D-9539.mydomain.com");
//System.setProperty("sun.security.krb5.debug", "true");
Configuration config = HBaseConfiguration.create();
config.set("hadoop.security.authentication", "Kerberos");
config.set("hbase.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(config);
config.set("hbase.zookeeper.quorum", "D-9539.mydomain.com");
config.setInt("zookeeper.recovery.retry",1);
config.set("zookeeper.znode.parent","/hbase-secure");
config.set("hbase.client.retries.number", Integer.toString(2));
config.set("zookeeper.session.timeout", Integer.toString(60000));
UserGroupInformation userGroupInformation = UserGroupInformation.loginUserFromKeytabAndReturnUGI("mohanv@EXAMPLE.COM", "D:\\mohanv.keytab" );
//UserGroupInformation userGroupInformation = UserGroupInformation.loginUserFromKeytabAndReturnUGI("hbase-D9539@EXAMPLE.COM", "/Users/guest/Work/workspace/hbase.headless.keytab" );
UserGroupInformation.setLoginUser(userGroupInformation);
Connection conn = ConnectionFactory.createConnection(config);
TableName tablename=TableName.valueOf("tweetTest2");
Table table = conn.getTable(tablename);
Get get=new Get(Bytes.toBytes("row1")) ;
get.addFamily(Bytes.toBytes("twt"));
System.out.println(Bytes.toString(table.get(get).getRow()));
但是
org.apache.hadoop.hbase.client.RetriesExhaustedException:
然后
clientClosingConnectionException
答案 0 :(得分:0)
我相信您还需要在HBase配置中设置服务主体。必须存在以下属性,并配置HBase主服务器和区域服务器的服务主体:
hbase.master.kerberos.principal
hbase.regionserver.kerberos.principal
另一种方法是将hbase-site.xml添加到类路径中,该路径应设置这些属性。
答案 1 :(得分:0)
您需要在配置中设置以下属性。 可以从以下位置获取区域服务器和主服务器的exat值: conf / hbase-site.xml。检查相关属性
grep -nrl "db_column=b" apps | xargs sed -i "s/db_column=b/db_column=/g"
推荐here