当前位置: 首页 > 面试题库 >

从Windows使用Java和Kerberos Keytab访问Cloudera上的HDFS

龙涵蓄
2023-03-14
问题内容

我正在尝试连接到在Cloudera上运行的HDFS实例。我的第一个步骤启用Kerberos和创建Keytabs(如图所示这里)。

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

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:无法从用户获取密码

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


问题答案:

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

更麻烦的是,还没有该DLL(以及Windows的“存根”(Stub))的正式版本,该DLL可以从Java使用它。您必须 (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机器上使用来创建密钥表文件ktutil(或使用Active
Directory管理员通过一些AD命令为您创建了密钥表文件),并且
C:\Some Other Dir\foo.keytab
如果密钥表是用于实际Windows帐户的,则将该文件放在其他任何东西下- -即您自己的帐户-或Prod服务帐户,然后 确保密钥表是安全的!
使用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中,分别在“ Environment”和“ VM Arguments”中进行设置)



 类似资料:
  • 我下载并安装了VM Cloudera4.4来使用Hadoop。我已经在一个平台上为我的工作建立了一个集群,所以我对Hadoop的工作原理略有了解。所以我认为我的问题来自于我对linux和他的用户和群体的误解。 使用配置单元: 我尝试用shell创建一个配置单元表,它起作用了。我在/user/hive/warehouse/test中有一个表,它属于cloudera组的用户cloudera。 我在hd

  • 我正在尝试通过https使用webservice。身份验证使用客户端CA。导入wsdl后,我创建了一个密钥库: "C:\Program Files\Java\jdk1.7.0_40\bin\keytool.exe"-keystoremykeystore.jks-store pass change eit-import cert-alias webservice-Trust cacerts-file

  • 问题内容: 我创建了两个Java文件:和。 我尝试在命令提示符下使用javac编译代码,如下所示: 我正在访问被拒绝错误: 我在做什么导致此错误? 问题答案: 您似乎正在尝试将源文件放在系统目录中。尝试为您的源文件创建自己的目录(在您自己的主目录下),而不是将它们放在系统路径中。您可能没有写该目录的权限(但我不确定您如何将源文件保存在该目录中)。

  • 本文向大家介绍使用Python的Windows注册表访问(Winreg),包括了使用Python的Windows注册表访问(Winreg)的使用技巧和注意事项,需要的朋友参考一下 作为一种通用的语言,以及大量用户支持的模块的可用性,我们发现python在操作系统级别的编程方面也很擅长。在本文中,我们将看到python如何访问Windows操作系统的注册表。 我们需要将名为winreg的模块导入py

  • 我在Windows上使用MySQL(我希望我使用的是Mac,但由于某些问题,我正在使用Bootcamp),并且我遇到了一个我认为以前遇到过的问题:标题中写的错误。我想我之前可能已经解决了这个问题,通过控制面板擦除MySQL,并从ProgramFiles中删除隐藏文件夹,ProgramData和MySQL中的所有内容,然后重新安装它。这很麻烦,消耗了很多时间。如果我一次又一次地遇到这样的错误,这绝对

  • 问题内容: 我需要一个允许我使用Java在Gmail中进行电子邮件操作(例如,发送/接收邮件)的库。 问题答案: 您是否看到过Java的g4j-GMail API? GMailer Java版API(g4j)是一组API,允许Java程序员与GMail进行通信。借助G4J,程序员可以制作基于GMail大量存储的基于Java的应用程序。