如何仅使用JavaAPI访问安全的kerberized hadoop
我对Kerberos很陌生。我使用的是共享Hadoop集群。我的管理员向我提供了用户名、密码以及KDC服务器的位置 是否可以仅使用JavaGSSAPI和HadoopUserGroupInformation类来访问Hadoop集群 对于非kerberos hadoop集群,这将是我用来从HDFS读取文件的代码片段:如何仅使用JavaAPI访问安全的kerberized hadoop,java,security,hadoop,kerberos,jaas,Java,Security,Hadoop,Kerberos,Jaas,我对Kerberos很陌生。我使用的是共享Hadoop集群。我的管理员向我提供了用户名、密码以及KDC服务器的位置 是否可以仅使用JavaGSSAPI和HadoopUserGroupInformation类来访问Hadoop集群 对于非kerberos hadoop集群,这将是我用来从HDFS读取文件的代码片段: String uname = <Some username>; UserGroupInformation ugi = UserGroupInformation.create
String uname = <Some username>;
UserGroupInformation ugi = UserGroupInformation.createRemoteUser(uname);
ugi.doAs(new PrivilegedExceptionAction<Void>(){
public Void run() throws Exception {
HdfsConfiguration hdfsConf = new HdfsConfiguration();
... SETUP Configuration ...
FileSystem fs = FileSystem.get(hdfsConf);
... Use 'fs' to read/write etc ...
}
});
String uname=;
UserGroupInformation ugi=UserGroupInformation.createRemoteUser(uname);
ugi.doAs(新特权接受行动){
public Void run()引发异常{
HdfsConfiguration hdfsConf=新的HdfsConfiguration();
…设置配置。。。
FileSystem fs=FileSystem.get(hdfsConf);
…使用“fs”读/写等。。。
}
});
现在,对于一个安全集群,我还为用户提供了kerberos密码。。
有人能告诉我,我需要对上面的代码片段做哪些具体更改,以便首先访问KDC并执行kinit,然后继续执行HDFS操作
请记住,在我计划部署Java应用程序的环境中,我可能没有在本地安装“kinit”,因此从Java中调用kinit进程不是一个选项
提前感谢..如果您有一个
keytab
文件作为UserGroupInformation
超级用户的身份,您可以使用org.apache.hadoop.security.security.SecurityUtil#login(…)
hadoop common库中提供的API直接从您的代码登录。可以找到完整的API
这需要在创建远程用户之前完成(或者更一般地说,在任何形式的套接字连接到各种服务守护进程之前),否则调用将失败,并且找不到登录凭据
您不需要在执行机器上安装或提供krb5工作站
软件包和实用程序,就可以让它工作。我也遇到过类似的问题。我会把我在文档中找不到的东西放进去
确保您的站点XML文件位于类路径中。
如果在从客户端执行java程序之前无法将其kinit,则无法针对安全群集部署作业,除非您在程序中构建kerberos客户端。我很好奇,如果我的服务器位于kerberos群集之外,它会工作吗?这意味着启动API的服务器没有被kerberised,它只需要指定提供的keytab就可以工作吗?