从同一进程访问两个安全(Kerberos)Hadoop / HBase集群

时间:2016-09-22 20:13:46

标签: java hadoop hbase kerberos

我有一个Java工具,可以将几行数据从一个HBase集群复制到另一个HBase集群(称为ClusterA和ClusterB)。当两个集群都没有安全保护时,这种方法很好:

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()方法从配置文件加载zookeeper仲裁设置。

现在,我正在尝试从不安全的群集到安全群集。很快,不安全的集群将升级到Kerberos身份验证,因此我需要在两个不同的经过Kerberos身份验证的集群之间复制数据。

我使用以下代码使用keytab文件登录到一个群集:

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加载,因为我已登录到ClusterA。像“tableB.get(...)”这样的调用就会挂起。

那么如何使用不同的身份验证访问两个不同的群集?

1 个答案:

答案 0 :(得分:1)

如果2个两个群集使用相同的KDC,则可以尝试对两个群集使用相同的Kerberos主体用户名和域/域。然后,单个keyTab文件对两个集群都有效。