java連接開啟kerberos的hbase踩坑記錄
因為不懂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!" );
}
java連接開啟kerberos的hbase踩坑記錄 - 簡書

浙公網安備 33010602011771號