经过研究后,我得出以下解决方案:
- 我实际上并不需要完整的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”。
- 由于之前的要点,您不需要复制任何内容或更改权限。



