Hadoop IOException 登录失败

标签 hadoop authentication configuration java-8 ioexception

我是 Hadoop 的新手。但是,我已经能够在我的服务器上以集群模式成功地使用 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 碰巧无法使用我在 workers 上的用户名登录。我尝试从其他来源查找并遵循他们的指导,例如添加环境变量 HADOOP_USER_NAME,删除和重置整个数据节点和名称节点等。但是,在这种情况下,它们都不适合我。

这个问题的奇怪之处在于,当我尝试切换回 Java 7 时。Hadoop 对我来说像以前一样工作正常。但是,我认为不会因为 Java 版本之间的差异而出现问题,因为根据其文档,Hadoop 与它们都兼容。此外,受信任的 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"

最佳答案

我在使用 Java 8 从 docker 容器运行 hbase 客户端时遇到了同样的问题。这显然是由使用类 com.sun.security.auth.module.UnixLoginModule 引起的 native 调用以获取 unix 用户名。在我的例子中,它没有映射到 docker 中,并且该类抛出 NullPointerException。这不是 hadoop 本身的错误。

为了指示 hadoop 绕过操作系统用户名的查找,我能够在所有初始化之前添加以下代码行:

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

在您的情况下,您正在运行服务器,因此您注入(inject)代码的选项是有限的。相反,有两个选项:

  1. 尝试使用 IBM JDK
  2. 尝试调试工作人员 ($ whoami) 上的操作系统用户设置。如果它显示类似“无法找到用户 ID XXXX 的名称”之类的内容,请检查/etc/passwd 设置

关于Hadoop IOException 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864985/

相关文章:

Apache 2.4 代理 AJP 服务于 Tomcat 8 的多个域

bash - 将参数从 shell 脚本传递到 hive 脚本

hadoop - 无法在 MESOS 框架 : Could not find or load main class org. apache.mesos.hdfs.scheduler.Main 上运行 HDFS

php - 重定向到另一个域然后返回后丢失 session

authentication - 如何扩展 ServiceStack 身份验证

wcf - 通过环境变量动态指定 WCF 服务端点

hadoop - 如何修改 Hue 的 Sqoop 应用程序的规范导入示例,使其可重新运行?

hadoop - 运行名称节点时出错

node.js - 使用服务帐户 key 验证 Google Photos API?

c# - 我可以停止 IIS 吗?