2016-09-22 5 views
0

私は、ある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つの異なるクラスタにアクセスするにはどうすればよいですか。

+0

https://stackoverflow.com/questions/38454684/kerberos-java-credentials-cache –

答えて

1

2つの2つのクラスタで同じKDCが使用されている場合は、両方のクラスタで同じKerberosプリンシパルのユーザー名とドメイン/レルムを使用できます。次に、単一のkeyTabファイルが両方のクラスタに対して有効です。

関連する問題