私は、あるHBaseクラスタから別のHBaseクラスタに少数の行のデータをコピーするJavaツールを持っています。どちらのクラスタが固定されているとき、これがうまく働いた:同じプロセスから2つのセキュリティ保護された(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()メソッドを設定ファイルからのZooKeeperクォーラム設定をロードします。
ここでは、これを保護されていないクラスターから保護されたクラスターにしようとしています。まもなく、セキュリティ保護されていないクラスタはKerberos認証にアップグレードされるため、2つの異なるKerberos認証クラスタ間でデータをコピーする必要があります。
私はkeytabファイルを使用して、1つのクラスタにログインするために、次のコードを使用します。
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);
これは、1つのクラスタのみでの操作のために正常に動作します。ただし、setConfiguration()およびloginUserFromKeytab()はstaticメソッドです。私はこのように、clusterBのにアクセスするための第二の構成オブジェクトconfigBを作成する場合:
Configuration configB = Utilities.makeHBaseConfig("configB.xml");
私はでclusterAにログインしていますので、それから私は、もはやclusterBのからロードすることができていません。 "tableB.get(...)"のような呼び出しはちょうどハングします。
異なる認証で2つの異なるクラスタにアクセスするにはどうすればよいですか。
https://stackoverflow.com/questions/38454684/kerberos-java-credentials-cache –