3

以下のコードを使用して、Kerberized hdfs クラスターに接続しようとしています。同じ以下のコードを使用して、HBaseConfiguration を使用して hbase にアクセスできます。

Configuration config = new Configuration();
config.set("hadoop.security.authentication", "Kerberos");

UserGroupInformation.setConfiguration(config);
UserGroupInformation ugi = null;
ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("me@EXAMPLE>COM","me.keytab");
model = ugi.doAs((PrivilegedExceptionAction<Map<String,Object>>) () -> { 
  testHadoop(hcb.gethDFSConfigBean());
  return null;
});

同じキータブとプリンシパルを使用して、Solr、Impala に正常にアクセスできました。この奇妙な Failed to find service name for hdfs を取得しています。

以下のスタックトレースを見てください

java.io.IOException: Failed on local exception: java.io.IOException: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name; Host Details : local host is: "Securonix-int3.local/10.0.4.36"; destination host is: "sobd189.securonix.com":8020; 
    at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:772)
    at org.apache.hadoop.ipc.Client.call(Client.java:1472)
    at org.apache.hadoop.ipc.Client.call(Client.java:1399)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:232)
    at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:752)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy10.getFileInfo(Unknown Source)
    at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1988)
    at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1118)
    at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1114)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1114)
    at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1400)
    at com.securonix.application.ui.uiUtil.SnyperUIUtil.lambda$main$4(SnyperUIUtil.java:1226)
    at com.securonix.application.ui.uiUtil.SnyperUIUtil$$Lambda$6/1620890840.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at com.securonix.application.ui.uiUtil.SnyperUIUtil.main(SnyperUIUtil.java:1216)
Caused by: java.io.IOException: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name
    at org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:643)
    at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:730)
    at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:368)
    at org.apache.hadoop.ipc.Client.getConnection(Client.java:1521)
    at org.apache.hadoop.ipc.Client.call(Client.java:1438)
    ... 23 more
Caused by: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name
    at org.apache.hadoop.security.SaslRpcClient.getServerPrincipal(SaslRpcClient.java:322)
    at org.apache.hadoop.security.SaslRpcClient.createSaslClient(SaslRpcClient.java:231)
    at org.apache.hadoop.security.SaslRpcClient.selectSaslClient(SaslRpcClient.java:159)
    at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:396)
    at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:553)
    at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:368)
    at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:722)
    at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:718)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:717)

Kerberos のデバッグ コードを有効にした後、FileSystem.get(); を呼び出したときに以下のデバッグ ログを取得しました。ケルベロア デバッグ ログ:

Java 構成名: null Java 構成名: null ネイティブ構成名: /etc/krb5.conf ネイティブ構成名: /etc/krb5.conf ネイティブ構成からロード ネイティブ構成からロード 16/02/22 15:53:14 WARN util .NativeCodeLoader: お使いのプラットフォームのネイティブ Hadoop ライブラリをロードできません... 該当する場合は組み込み Java クラスを使用
Java 構成名: null Java 構成名: null ネイティブ構成名: /etc/krb5.conf ネイティブ構成名: /etc/ krb5.conf ネイティブ構成からロード ネイティブ構成からロード

KdcAccessibility: リセット >>> KdcAccessibility: リセット KdcAccessibility: リセット >>> KdcAccessibility: リセット, readName(): securonix KeyTab: load() エントリの長さ: 55; タイプ: 23 >>> KeyTab: load() エントリの長さ: 55; タイプ: 23 KeyTabInputStream, readName(): EXAMPLE.COM >>> KeyTabInputStream, readName(): EXAMPLE.COM KeyTabInputStream, readName(): securonix >>> KeyTabInputStream, readName(): securonix KeyTab: load() エントリの長さ: 71 ; タイプ: 18 >>> KeyTab: load() エントリの長さ: 71; type: 18 次のキーを探しています: securonix@EXAMPLE。

興味深いことに、hdfs.exists() のようなファイル システムの API を使用すると、

 >>>KinitOptions cache name is /tmp/krb5cc_501
 >> Acquire default native Credentials
 default etypes for default_tkt_enctypes: 18 18 16.
 >>> Found no TGT's in LSA
4

2 に答える 2

4

問題は、HDFS が構成にデータノードのプリンシパルである dfs.datanode.kerberos.principal の値があることを期待していることだと思いますが、この場合は欠落しています。

core-site.xml のみから構成インスタンスを作成し、hdfs-site.xml を追加するのを忘れたときに、同じ問題が発生しました。hdfs-site.xml を追加するとすぐに機能し始め、hdfs-site.xml には次のものがありました。

 <property>
      <name>dfs.datanode.kerberos.principal</name>
      <value>....</value>
 </property>

お役に立てれば。

于 2016-03-15T17:02:53.073 に答える
0

HDFS の代わりに Isilon/OneFS をストレージとして使用して、Spark2 と HDP3.1 で同じ問題が発生しました。

OneFS サービス管理パックは、dfs.datanode.kerberos.principal など、Spark2 で予期される一部の HDFS パラメーターの構成を提供しません (Ambari ではまったく使用できません)。これらのパラメーターがないと、Spark2 HistoryServer は起動に失敗し、「サーバーのプリンシパル名を指定できませんでした」などのエラーを報告する場合があります。

カスタム hdfs-site の下の OneFS に次のプロパティを追加しました。

dfs.datanode.kerberos.principal=hdfs/_HOST@<MY REALM>
dfs.datanode.keytab.file=/etc/security/keytabs/hdfs.service.keytab
dfs.namenode.kerberos.principal=hdfs/_HOST@<MY REALM>
dfs.namenode.keytab.file=/etc/security/keytabs/hdfs.service.keytab 

これにより、初期エラーが解決されました。その後、次の形式のエラーが発生しました。

Server has invalid Kerberos principal: hdfs/<isilon>.my.realm.com@my.realm.com, expecting: hdfs/somewhere.else.entirely@my.realm.com

これはクロスレルム認証に関連していました。以下の設定をカスタム hdfs-site に追加することで解決しました。

dfs.namenode.kerberos.principal.pattern=*
于 2019-02-28T13:07:53.040 に答える