从远程主机访问HDFS通过Java API,用户认证(HDFS access from remote

2019-08-21 15:22发布

我需要通过Java API的使用HDFS集群的远程桌面。 直到它写访问一切正常确定。 如果我试图创建任何文件,我收到访问权限例外。 路径看起来不错,但异常指示我的远程桌面的用户名,这当然是不是我所需要访问所需的HDFS目录。

现在的问题是: - 是否有任何的方式来表示不同的用户名使用的Java API“简单”的认证? - 能否请您点认证/授权方案的一些很好的解释在Hadoop中/ HDFS最好与Java API的例子吗?

是的,我已经知道“WHOAMI”能在这种情况下使用shell别名超载,但我更喜欢以避免这样的解决方案。 另外细节这里是我不喜欢像通过SSH和脚本管一些技巧的使用。 我想用纯Java API来执行的一切。 先感谢您。

Answer 1:

一些研究之后,我来到了以下解决方案:

  • 我实际上并不需要完整的解决方案的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代码所示:

  1. 你不需要sudo
  2. 你并不需要真正适合本地用户的HDFS“。
  3. 你并不需要复制,因为之前的点什么或更改权限。


文章来源: HDFS access from remote host through Java API, user authentication