1

我正在尝试连接到在 Cloudera 上运行的 HDFS 实例。我的第一步是启用 Kerberos 并创建 Keytabs(如此处所示

在下一步中,我想使用 keytab 进行身份验证。

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://cloudera:8020");
conf.set("hadoop.security.authentication", "kerberos");

UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("hdfs@CLOUDERA", "/etc/hadoop/conf/hdfs.keytab");

FileSystem fs = FileSystem.get(conf);
FileStatus[] fsStatus = fs.listStatus(new Path("/"));
for (int i = 0; i < fsStatus.length; i++) {
    System.out.println(fsStatus[i].getPath().toString());
}

它失败并出现以下错误

java.io.IOException:从 keytab /etc/hadoop/conf/hdfs.keytab 登录 hdfs@CLOUDERA 失败:javax.security.auth.login.LoginException:无法从用户获取密码

问题是:如何正确处理密钥表?我必须将它复制到我的本地机器吗?

4

2 回答 2

2

当在 Windows 上运行 Hadoop 客户端以访问 kerberized 集群时,您需要一个特定的“本机库”(即 DLL)。
据我所知,没有充分的理由,因为该库实际上并没有在一些自动回归测试之外使用(!?!)所以这是 Hadoop 提交者给 Hadoop 用户带来的痛苦。

为了增加额外的痛苦,没有该 DLL 的官方构建(以及允许从 Java 使用它的 Windows“存根”)。您必须(a)从源代码自己构建它——祝你好运——或者(b)在互联网上搜索可下载的 Hadoop-for-Windows 运行时,并祈祷它不包含任何恶意软件。
最好的选择(对于 64 位 Windows)在这里:https
://github.com/steveloughran/winutils ...并且自述文件解释了为什么您可以合理地信任该运行时。但是,如果您坚持使用较旧的 32 位 Windows,那么您就只能靠自己了。

现在让我们假设您在您的 Windows 框下部署了该运行时
  C:\Some Dir\hadoop\bin\
(最后一个bin是必需的;嵌入式空间只是额外的乐趣)

您必须使用几个 Java 属性将 Hadoop 客户端指向该运行时:(
  "-Dhadoop.home.dir=C:/Some Dir/hadoop" "-Djava.library.path=C:/Some Dir/hadoop/bin"
注意整个 Windows args 周围的双引号,以保护路径中的嵌入空间,这些空间已被转换为 Java 样式以获得额外的乐趣)
(在 Eclipse 中,只需将这些道具填充在“VM Arguments”下,包括引号)

现在,有了 Kerberos 配置。如果您的 KDC 是您的公司 Active Directory 服务器,那么 Java 应该会自动找到配置参数。但是,如果您的 KDC 是在 Linux 上安装的独立“MIT Kerberos”,那么您必须/etc/krb5.conf在集群上找到一个有效文件,将其复制到您的 Windows 机器上,并让 Java 将其与附加属性一起使用...
  "-Djava.security.krb5.conf=C:/Some Other Dir/krb5.conf"

然后假设您已经在 Linux 机器上创建了您的 keytab 文件,使用ktutil(或 Active Directory 管理员使用一些 AD 命令为您创建了它)并且您将文件放在
  C:\Some Other Dir\foo.keytab
了其他之前,如果 keytab 用于真实的 Windows 帐户 - - 即您自己的帐户 - 或 Prod 服务帐户,然后确保 keytab 是安全的!使用 Windows 安全对话框来限制对您帐户的访问(可能还有系统,用于备份)。因为该文件可以使任何机器上的任何人都能够在集群(以及任何支持 Kerberos 的系统,包括 Windows)上进行身份验证。

现在您可以尝试使用
UserGroupInformation.loginUserFromKeytab("foo@BAR.ORG", "C:/Some Other Dir/foo.keytab");

如果它不起作用,请使用环境变量
  set HADOOP_JAAS_DEBUG=true
...和 ​​Java 属性启用 Kerberos 调试跟踪
  -Dsun.security.krb5.debug=true
(在 Eclipse 中,分别在“环境”和“VM 参数”中设置它们)

于 2017-03-21T12:36:07.393 回答
2

您是否设置了适当的权限?

 chown hdfs:hadoop /etc/hadoop/conf/hdfs.keytab
 chmod 440 /etc/hadoop/conf/hdfs.keytab
于 2017-03-18T09:34:48.697 回答