我需要通过Java API的使用HDFS集群的远程桌面。 直到它写访问一切正常确定。 如果我试图创建任何文件,我收到访问权限例外。 路径看起来不错,但异常指示我的远程桌面的用户名,这当然是不是我所需要访问所需的HDFS目录。
现在的问题是: - 是否有任何的方式来表示不同的用户名使用的Java API“简单”的认证? - 能否请您点认证/授权方案的一些很好的解释在Hadoop中/ HDFS最好与Java API的例子吗?
是的,我已经知道“WHOAMI”能在这种情况下使用shell别名超载,但我更喜欢以避免这样的解决方案。 另外细节这里是我不喜欢像通过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的博客文章“ 授权和验证Hadoop中 ”。 总之,专注于Hadoop的安全方法简单的解释。 没有具体到Java API解决方案,但有利于问题的基本理解的信息。
更新:
替代那些谁使用命令行hdfs
或者hadoop
工具,而不需要本地用户:
HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /
你真正要做的就是你读本地文件,根据您的本地权限,但将文件放在HDFS当你喜欢认证用户hdfs
。
这有非常相似的性质API代码所示:
- 你不需要
sudo
。 - 你并不需要真正适合本地用户的HDFS“。
- 你并不需要复制,因为之前的点什么或更改权限。