2017-01-26 80 views
6

Jestem całkiem nowy dla Hadoop. Udało mi się jednak z powodzeniem skonfigurować program hadoop 2.7.3 z Javą 7 w trybie klastra na moich serwerach. Wszystko działa zupełnie dobrze.Niepowodzenie logowania do Haoop IOException do zalogowania się

Ale wtedy, gdy próbuję włączyć Java 8 i rozpocząć DFS, wystąpił błąd:

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 

Wydaje się Hadoop dzieje się nie być w stanie zalogować się używając swojej nazwy użytkownika na robotników. Próbuję sprawdzić to z innych źródeł i postępować zgodnie z ich wskazówkami, na przykład dodając zmienną środowiskową HADOOP_USER_NAME, usuwając i resetując cały datanod i namenode itp. Jednak żadne z nich nie działa dla mnie w tym przypadku.

Dziwne w tym problemie jest to, że kiedy próbuję przełączyć się z powrotem na Javę 7. Hadoop działa dobrze dla mnie jak poprzednio. Jednak nie sądzę, że powinien istnieć problem z powodu różnicy między wersjami Javy, ponieważ Hadoop jest zgodny z obydwoma na podstawie swojej dokumentacji. Zaufany ssh jest już skonfigurowany w klastrze.

Poniżej jest moje konfiguracje .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

Z jakiego systemu operacyjnego korzystasz i którą wersję? Szczerze mówiąc, nie wygląda to jak błąd Hadoop, bardziej jak jakiś problem w natywnych bibliotekach bezpieczeństwa Java. – Serhiy

+0

@Serhiy Używam CentOS 6.8 z Hadoop 2.7.3. Myślałem też o bibliotekach bezpieczeństwa Java, ale uważam, że biblioteka jest kompatybilna z językiem Java 8. Dlatego nie mam pojęcia, jak rozwiązać problem. – Tim

+0

Spróbuj ustawić zmienną '-DHADOOP_JAAS_DEBUG' na 'true' w ścieżce klas (podczas uruchamiania Hadoop), z kodu źródłowego wydaje się, że możesz zobaczyć dodatkowe szczegóły dotyczące problemu. Dodatkowo, możesz spróbować zrobić to, co "UserGroupInformation" robi w metodzie, która się nie udała, stworzyć prostą aplikację, która utworzyła 'LoginContext' i spróbuje' zalogować się', możesz mieć większą kontrolę nad problemem we własnym fragmencie kod. – Serhiy

Odpowiedz

3

Napotkałem ten sam problem podczas uruchamiania klienta HBase z pojemnika Döcker z Java 8. To jest najwyraźniej spowodowane klasy com.sun.security .auth.module.UnixLoginModule, który używa połączenia natywnego, aby uzyskać nazwę użytkownika unix. W moim przypadku nie jest on odwzorowany w oknie dokowanym, a klasa generuje wyjątek NullPointerException. To nie jest błąd w hadoopie per se.

pouczać Hadoop ominąć odnośnika z nazwą użytkownika OS, udało mi się dodać następujący wiersz kodu przed wszystkimi inicjalizacji:

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

W twoim przypadku, jest uruchomiony serwer, więc opcji wstrzykiwania kodu są ograniczone. Zamiast tego są dwie opcje:

  1. Try IBM JDK zamiast
  2. próba debugowania konfiguracji użytkownika OS na pracowników ($ whoami). Jeśli mówi coś „nie może znaleźć nazwę dla identyfikatora użytkownika XXXX”, a następnie sprawdzić/etc/passwd konfigurację
+0

Spędziłem pół dnia debugując Spark próbując to zrozumieć. Dziękuję Ci bardzo. – Azuaron

0

miałem ten sam problem i okazało się, że moja jdk był currupt. Pobrałem więc nowy jdk i wskazałem nowo pobrany plik jdk na JAVA_HOME w pliku hadoop-env.sh, a teraz wszystko działa sprawnie.