经过一番研究,我得出了以下解决方案:
- 我实际上并不需要完整的 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 上时,您会像 user 一样进行身份验证hdfs
。
这与所示的 API 代码具有非常相似的属性:
- 你不需要
sudo
。
- 您实际上不需要适当的本地用户“hdfs”。
- 由于前面的几点,您不需要复制任何内容或更改权限。