我有一个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 –