2017-01-26 3 views
6

Я довольно новичок в Hadoop. Тем не менее, мне удалось успешно настроить hadoop 2.7.3 с Java 7 в режиме кластера на моих серверах. Все работает отлично.Hadoop IOException отказ войти в систему

Но тогда, когда я пытаюсь переключиться на Java 8 и начать поиск в глубину, есть ошибка:

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 отлично работает для меня, как раньше. Однако я не думаю, что проблема должна быть связана с различием между версиями Java, поскольку Hadoop совместим с обоими из них на основе документации. Кроме того, доверенный ssh ​​уже настроен внутри кластера.

Ниже мое .bashrc конфигурация FYI:

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

Какая ОС вы используете и какую версию? Честно говоря, это не похоже на ошибку Hadoop, больше похожую на некоторую проблему в собственных Java-системах безопасности. – Serhiy

+0

@Serhiy Я использую CentOS 6.8 с Hadoop 2.7.3. Я тоже думал о Java-безопасности, но я считаю, что библиотека совместима с Java 8. Следовательно, я понятия не имею, как решить проблему. – Tim

+0

Попробуйте установить переменную '-DHADOOP_JAAS_DEBUG' в' true' в пути к классам (при запуске Hadoop), из исходного кода кажется, что вы можете увидеть некоторые дополнительные сведения о проблеме. Кроме того, вы можете попробовать сделать то, что 'UserGroupInformation' делает в неудавшемся методе, создать простое приложение, которое создало бы« LoginContext »и попыталось бы« войти », возможно, у вас будет больше контроля над проблемой в вашей собственной части код. – Serhiy

ответ

3

Я столкнулся с теми же проблемами при запуске клиента Hbase из Докер контейнера с Java 8. Это, по-видимому, вызванным классом com.sun.security .auth.module.UnixLoginModule, который использует собственный вызов для получения имени пользователя unix. В моем случае он не отображается в докере, а класс бросает исключение NullPointerException. Это не ошибка в хаупе как таковой.

Поручить Hadoop обойти поиск имени пользователя ОС, я был в состоянии добавить следующую строку кода перед всей инициализации:

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

В вашем случае, вы работаете на сервере, так что ваши варианты инъекции кода ограничены. Вместо этого есть два варианта:

  1. Try JDK фирмы IBM вместо
  2. Try для отладки настройки пользователя ОС на рабочих ($ Whoami). Если он говорит что-то вроде «не может найти имя для идентификатора пользователя XXXX», а затем проверить/и т.д./пароль настройки
+0

Я потратил полдня на отладку Искры, пытаясь понять это. Большое спасибо. – Azuaron

0

У меня была такая же проблема, и узнал, что мой JDK был currupt. Поэтому я загрузил новый jdk и указал недавно загруженный jdk на JAVA_HOME в файле hadoop-env.sh, и теперь все работает плавно.

Смежные вопросы