Ошибка Hadoop IOException для входа в систему

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

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

Ответ 1

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

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

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

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

  • Попробуйте вместо IBM JDK
  • Попробуйте отладить настройку пользователя ОС для рабочих ($ whoami). Если он говорит что-то вроде "не может найти имя для идентификатора пользователя XXXX", тогда проверьте установку /etc/passwd

Ответ 2

Столкнулся с той же ошибкой при запуске искрового кода из IDE.

Exception in thread "main" java.io.IOException: failure to login
        at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:822)
        at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:774)
        at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:647)
        at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2464)
        at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2464)
        at scala.Option.getOrElse(Option.scala:121)
        at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2464)
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:292)
        at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2486)
        at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:930)
        at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:921)
        at scala.Option.getOrElse(Option.scala:121)
        at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:921)
        at SimpleApp$.main(SimpleApp.scala:17)
        at SimpleApp.main(SimpleApp.scala)
Caused by: javax.security.auth.login.LoginException:
java.lang.NullPointerException: invalid null input: name

В резолюцию добавлено следующее утверждение в основной код.

UserGroupInformation.setLoginUser(UserGroupInformation.createRemoteUser("vyxx"))

Ответ 3

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

Ответ 4

Я обнаружил, что мне не нужно предпринимать никаких особых мер в коде, если я проверяю, правильно ли настроен образ докера для пользователя jenkins. Код, который я использую для настройки образа для пользователя jenkins для образов на основе Debian/Ubuntu:

# Add Jenkins user
groupadd --gid 1000 jenkins
useradd --uid 1000 --gid jenkins --shell /bin/bash --home-dir /var/jenkins_home jenkins
mkdir /var/jenkins_home
chown 1000:1000 /var/jenkins_home
echo 'jenkins ALL=NOPASSWD: ALL' >> /etc/sudoers.d/50-jenkins
echo 'Defaults    env_keep += "DEBIAN_FRONTEND"' >> /etc/sudoers.d/env_keep