我有一個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(...)」這樣的調用只是掛起。
那麼如何訪問兩個不同身份驗證的集羣呢?
看看https://stackoverflow.com/questions/38454684/kerberos-java-credentials-cache –