2016-09-22 122 views
0

我有一個Java工具,可以將一行HBase集羣中的數據複製到另一個集羣(稱爲ClusterA和ClusterB)。這種精細工作時,既沒有簇固定:從同一進程訪問兩個安全(Kerberos)Hadoop/HBase集羣

Configuration configA = Utilities.makeHBaseConfig("configA.xml"); 
Configuration configB = Utilities.makeHBaseConfig("configB.xml"); 
HTable tableA = new HTable(configA, input_table); 
HTable tableB = new HTable(configB, output_table); 
tableA.get(...) 
tableB.put(...) 

注:Utilities.makeHBaseConfig()方法從加載配置文件中的動物園管理員法定人數設置。

現在,我試圖從一個不安全的羣集到一個安全的羣集。很快,不安全的集羣將升級到Kerberos身份驗證,因此我需要在兩個不同的Kerberos身份驗證集羣之間複製數據。

我用下面的代碼登錄到一個集羣,使用密鑰表文件:

Configuration configA = Utilities.makeHBaseConfig("configA.xml"); 
File keyTab = new File(keytab_path).getCanonicalPath(); 
configA.set(HBASE_KEY_TAB_FILE_KEY, keyTab); 
configA.set(HADOOP_SECURITY_AUTHORIZATION, "true"); 
configA.set(HADOOP_SECURITY_AUTHENTICATION, "Kerberos"); 
UserGroupInformation.setConfiguration(configA); 
UserGroupInformation.loginUserFromKeytab(user, keyTab); 

這工作正常操作只有一個集羣上。但是,setConfiguration()和loginUserFromKeytab()方法是靜態的方法。如果我創建第二個配置對象configB訪問ClusterB,像這樣:

Configuration configB = Utilities.makeHBaseConfig("configB.xml"); 

然後我不再能夠從ClusterB加載,因爲我登錄到clusteA在。像「tableB.get(...)」這樣的調用只是掛起。

那麼如何訪問兩個不同身份驗證的集羣呢?

+0

看看https://stackoverflow.com/questions/38454684/kerberos-java-credentials-cache –

回答

1

如果兩個兩個集羣使用相同的KDC,則可以嘗試爲兩個集羣使用相同的Kerberos主體用戶名和域/ realm。然後,單個keyTab文件對兩個羣集都有效。