2017-01-26 23 views
6

私はHadoopの新機能です。しかし、サーバー上のクラスタモードでJava 7を使用してhadoop 2.7.3を正常にセットアップできました。すべてが完全にうまく動作します。Hadoop IOExceptionログインに失敗しました

しかし、私は、Java 8に切り替えて、DFSを起動しようとすると、その後、エラーがある:

Exception in thread "main" java.io.IOException: failure to login 
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:824) 
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:761) 
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:634) 
    at org.apache.hadoop.hdfs.tools.GetConf.run(GetConf.java:315) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
    at org.apache.hadoop.hdfs.tools.GetConf.main(GetConf.java:332) 
Caused by: javax.security.auth.login.LoginException: java.lang.NullPointerException: invalid null input: name 
    at com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:71) 
    at com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:133) 
    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:498) 
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:755) 
    at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195) 
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682) 
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680) 
    at javax.security.auth.login.LoginContext.login(LoginContext.java:587) 
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:799) 
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:761) 
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:634) 
    at org.apache.hadoop.hdfs.tools.GetConf.run(GetConf.java:315) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
    at org.apache.hadoop.hdfs.tools.GetConf.main(GetConf.java:332) 

    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:856) 
    at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195) 
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682) 
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680) 
    at javax.security.auth.login.LoginContext.login(LoginContext.java:587) 
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:799) 
    ... 6 more 

Hadoopのは、労働者に自分のユーザー名を使用してログインすることはできないために起こるように思え。私は他のソースからそれを調べて、環境変数HADOOP_USER_NAMEを追加する、datanodeとnamenode全体を削除して再設定するなどのガイダンスに従っています。しかし、このケースではどれも私のために働いていません。

この問題に関する奇妙なことは、私がJava 7に切り替えるときです。Hadoopは前と同じように私にとってうまく機能します。しかし、Hadoopはそのドキュメンテーションに基づいて両者に互換性があるので、Javaバージョンの違いにより、問題はないはずです。また、信頼できるsshはすでにクラスタ内に設定されています。

以下

FYI私の.bashrcの設定である:それは明らかにクラスcom.sun.securityによって引き起こされる

export JAVA_HOME="/scratch/dsat_server/jdk1.8.0_121" 
export HADOOP_PREFIX="/scratch/dsat_server/hadoop-2.7.3" 
export HADOOP_COMMON_LIB_NATIVE_DIR="$HADOOP_PREFIX/lib/native" 
export HADOOP_CONF_DIR="$HADOOP_PREFIX/conf" 
export HADOOP_OPTS="-Djava.net.preferIPv4Stack=truei-Djava.library.path=$HADOOP_PREFIX/lib" 
+0

使用しているOSはどれですか?正直言って、Hadoopのバグのようには見えません。ネイティブのJavaセキュリティライブラリのいくつかの問題によく似ています。 – Serhiy

+0

@Serhiy私はCentOS 6.8をHadoop 2.7.3で使用しています。私はJavaセキュリティライブラリについても考えましたが、ライブラリがJava 8と互換性があると考えています。したがって、問題を解決する方法がわかりません – Tim

+0

クラスパスで '-DHADOOP_JAAS_DEBUG'変数を' true'に設定しようとしますHadoopを起動するとき)、ソースコードから問題に関するいくつかの詳細を見ることができるようです。さらに、 'UserGroupInformation'が失敗したメソッドで何をしようとしているのか、' LoginContext'を作成して 'login'しようとする単純なアプリケーションを作成すると、あなた自身のコード。 – Serhiy

答えて

3

のJava 8とドッキングウィンドウコンテナからのHBaseクライアントを実行しているとき、私は同じ問題に遭遇しました.auth.module.UnixLoginModuleは、ネイティブ呼び出しを使用してUNIXのユーザー名を取得します。私の場合は、ドッカーにマップされておらず、クラスはNullPointerExceptionをスローします。これは、ハープープそのもののバグではありません。 OSのユーザー名の参照を回避するためにHadoopを指示する

、私はすべての初期化の前に、次のコード行を追加することができました:あなたのケースでは

UserGroupInformation.setLoginUser(UserGroupInformation.createRemoteUser("hduser")); 

を、サーバーを実行しているので、あなたの選択肢されていますコードを注入するのに制限があります。代わりに、2つのオプションがあります。

  1. は、IBM JDKに労働者($ whoamiは)上のOSのユーザー設定をデバッグする代わりに
  2. てみてみてください。それは、ユーザID XXXXの名前を見つけることができない 'のような何かを言う場合は、/ etc/passwdファイルのセットアップ
+0

スパークをデバッグするのに半日を費やしました。どうもありがとうございました。 – Azuaron

0

をチェックし、私は同じ問題を抱えていたし、私のJDKが curruptだったことが分かりました。だから私は新鮮なjdkをダウンロードし、にhadoop-env.shファイルに新しくダウンロードされたjdkを指摘し、すべてがスムーズに実行されます。

関連する問題