복붙노트

[HADOOP] Hadoop IOException 로그인 실패

HADOOP

Hadoop IOException 로그인 실패

저는 하둡을 처음 접했습니다. 그러나 서버의 클러스터 모드에서 Java 7을 사용하여 hadoop 2.7.3을 성공적으로 설정할 수있었습니다. 모든 것이 완벽하게 작동합니다.

그러나 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 추가, 전체 데이터 노드 및 네임 노드 삭제 및 재설정 등의 지침을 따랐습니다. 그러나이 경우에는 아무것도 작동하지 않습니다.

이 문제에 대한 이상한 점은 Java 7로 다시 전환하려고 할 때 Hadoop이 이전처럼 잘 작동한다는 것입니다. 그러나 Hadoop은 문서를 기반으로 두 버전과 호환되므로 Java 버전 간의 차이로 인해 문제가 발생하지 않는다고 생각합니다. 또한 신뢰할 수있는 ssh가 이미 클러스터 내에 설정되어 있습니다.

아래는 내 .bashrc 구성입니다.

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. ==============================

    1.Java 8이있는 도커 컨테이너에서 hbase 클라이언트를 실행할 때도 동일한 문제가 발생했습니다. 유니트 사용자 이름을 얻기 위해 기본 호출을 사용하는 클래스 com.sun.security.auth.module.UnixLoginModule에 의한 것 같습니다. 필자의 경우 도커에 매핑되지 않고 클래스에서 NullPointerException이 발생합니다. hadoop 자체의 버그는 아닙니다.

    Java 8이있는 도커 컨테이너에서 hbase 클라이언트를 실행할 때도 동일한 문제가 발생했습니다. 유니트 사용자 이름을 얻기 위해 기본 호출을 사용하는 클래스 com.sun.security.auth.module.UnixLoginModule에 의한 것 같습니다. 필자의 경우 도커에 매핑되지 않고 클래스에서 NullPointerException이 발생합니다. hadoop 자체의 버그는 아닙니다.

    hadoop에게 OS 사용자 이름 조회를 우회하도록 지시하기 위해 모든 초기화 전에 다음 코드 줄을 추가 할 수있었습니다.

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

    귀하의 경우 서버를 실행 중이므로 코드 삽입 옵션이 제한됩니다. 대신 두 가지 옵션이 있습니다.

  2. ==============================

    2.IDE에서 스파크 코드를 실행하는 동안 동일한 오류가 발생했습니다.

    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. ==============================

    3.도커 이미지가 jenkins 사용자에게 올바르게 구성되어 있는지 확인하면 코드에서 특별한 조치를 취할 필요가 없다는 것을 알았습니다. 데비안 / 우분투 기반 이미지의 jenkins 사용자 이미지를 설정하는 데 사용하는 코드는 다음과 같습니다.

    도커 이미지가 jenkins 사용자에게 올바르게 구성되어 있는지 확인하면 코드에서 특별한 조치를 취할 필요가 없다는 것을 알았습니다. 데비안 / 우분투 기반 이미지의 jenkins 사용자 이미지를 설정하는 데 사용하는 코드는 다음과 같습니다.

    # 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
    
  4. from https://stackoverflow.com/questions/41864985/hadoop-ioexception-failure-to-login by cc-by-sa and MIT license