2016-09-22 105 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文件对两个群集都有效。