因为不懂kerberos,当然到现在也不懂,遇到的几点坑,分享一下,有问题欢迎大家纠正
两点坑
conf.set("kerberos.principal" ,"hbase/_HOST@AC1.HBASE.COM" );
conf.set("hbase.master.kerberos.principal","hbase/_HOST@AC1.HBASE.COM");
conf.set("hbase.regionserver.kerberos.principal","hbase/_HOST@AC1.HBASE.COM");
这三个参数需要设置为 hbase配置文件中的hbase.master.kerberos.principal的配置,例如下图

第二点UserGroupInformation.loginUserFromKeytab中的user是你hbase数据库里面的用户名,与上面的principal不是一样的,记住不是一样的格式

附一段代码 开箱即用 有问题欢迎留言 准备攻克一下 这个kerberos 有点意思
public class App
{
private static Configurationconf =null;
static Connectionconn =null;
static {
// 这个配置文件主要是记录 kerberos的相关配置信息,例如KDC是哪个IP?默认的realm是哪个?
// 如果没有这个配置文件这边认证的时候肯定不知道KDC的路径喽
// 这个文件也是从远程服务器上copy下来的
System.setProperty("java.security.krb5.conf","记住是conf文件的绝对路径" );
conf = HBaseConfiguration.create();
conf.set("hadoop.security.authentication" ,"Kerberos" );
// 这个hbase.keytab也是从远程服务器上copy下来的, 里面存储的是密码相关信息
// 这样我们就不需要交互式输入密码了
conf.set("keytab.file" ,"keytab文件的绝对路径" );
conf.set("kerberos.principal" ,"hbase配置文件中的hbase.master.kerberos.principal" );
conf.set("hbase.master.kerberos.principal","hbase配置文件中的hbase.master.kerberos.principal");
conf.set("hbase.regionserver.kerberos.principal","hbase配置文件中的hbase.master.kerberos.principal");
conf.set("hbase.zookeeper.quorum",zookeeper地址 可以一个可以多个);
conf.set("hbase.zookeeper.property.clientPort",zookeeper端口);
conf.set("hbase.security.authentication","kerberos");
//存储hbase节点元数据的zookeeper节点,默认是/hbase/meta-region-server,但是也要根据具体的环境确认下,例如我们的这个环境,节点信息是存储在 /hbase-secure/meta-region-server
conf.set("zookeeper.znode.parent","/hbase-secure");
UserGroupInformation.setConfiguration(conf);
try {
UserGroupInformation.loginUserFromKeytab("数据库用户名","keytab文件的绝对路径" );
}catch (IOException e) {
e.printStackTrace();
}
try {
conn=ConnectionFactory.createConnection(conf);
}catch (IOException e) {
e.printStackTrace();
}
}
public static Boolean scanSpan(final String tableName)throws Exception {
Table table =conn.getTable(TableName.valueOf("表名"));
Put put=new Put(Bytes.toBytes(new String("test_authority2222")));
put.addColumn(Bytes.toBytes("fm1"),
Bytes.toBytes("user_id"),
Bytes.toBytes("0000000000000000")
);
table.put(put);
table.close();
return false;
}
public static void main( String[] args )
{
try {
System.out.println(scanSpan(""));
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
conn.close();
}catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("Hello World!" );
}
网友评论