我需要通过 Java API 从远程桌面使用 HDFS 集群。在写访问之前一切正常。如果我尝试创建任何文件,我都会收到访问权限异常。路径看起来不错,但异常指示我的远程桌面用户名,这当然不是我访问所需 HDFS 目录所需要的。
问题是: - 有什么方法可以在 Java API 中使用“简单”身份验证来表示不同的用户名? - 您能否用 Java API 示例对 hadoop/HDFS 中的身份验证/授权方案进行一些很好的解释?
是的,我已经知道在这种情况下使用 shell 别名可能会使 'whoami' 过载,但我更愿意避免这样的解决方案。这里还有一些细节是我不喜欢使用一些技巧,比如通过 SSH 和脚本的管道。我想只使用 Java API 执行所有操作。 提前谢谢你。
最佳答案
经过一番研究,我得出以下解决方案:
- 我实际上不需要完整的 Kerberos 解决方案,目前客户端可以运行来自任何用户的 HDFS 请求就足够了。环境本身被认为是安全的。
- 这为我提供了基于 hadoop UserGroupInformation 类的解决方案。将来我可以扩展它以支持 Kerberos。
示例代码可能对“假身份验证”和远程 HDFS 访问都有用:
package org.myorg;
import java.security.PrivilegedExceptionAction;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
public class HdfsTest {
public static void main(String args[]) {
try {
UserGroupInformation ugi
= UserGroupInformation.createRemoteUser("hbase");
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase");
conf.set("hadoop.job.ugi", "hbase");
FileSystem fs = FileSystem.get(conf);
fs.createNewFile(new Path("/user/hbase/test"));
FileStatus[] status = fs.listStatus(new Path("/user/hbase"));
for(int i=0;i<status.length;i++){
System.out.println(status[i].getPath());
}
return null;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
对有类似问题的人有用的引用:
- Cloudera 博客文章“Authorization and Authentication In Hadoop”。简短,侧重于对 hadoop 安全方法的简单解释。没有特定于 Java API 解决方案的信息,但有助于基本了解问题。
更新:
对于那些使用命令行 hdfs
或 hadoop
实用程序而不需要本地用户的人的替代方案:
HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /
您实际做的是根据您的本地权限读取本地文件,但是当将文件放在 HDFS 上时,您会像用户 hdfs
一样进行身份验证。
这与说明的 API 代码具有非常相似的属性:
- 您不需要
sudo
。 - 您不需要真正合适的本地用户“hdfs”。
- 您不需要因为之前的几点而复制任何内容或更改权限。
关于java - 通过 Java API 从远程主机访问 HDFS,用户身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941108/