为嵌入Java webapp的客户端设置hadoop系统用户

Chr*_*oop 29 hadoop cluster-computing

我想将MapReduce作业从java Web应用程序提交到远程Hadoop集群,但无法指定应该为哪个用户提交作业.我想配置和使用应该用于所有MapReduce作业的系统用户.

目前,我无法指定任何用户,无论hadoop作业在客户端系统当前登录用户的用户名下运行.这会导致消息出错

Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x
Run Code Online (Sandbox Code Playgroud)

...其中"alice"是客户端计算机上的本地登录用户.

我试过了

  1. 创建UserGroupInformation实例的各种组合(代理和普通用户)和
  2. 设置Java System属性-Duser.name=hduser,更改USERenvar和作为硬编码System.setProperty("user.name", "hduser")调用.

......无济于事 关于1)我承认不知道应该如何使用这些类.另请注意,更改Java System属性显然不是在Web应用程序中使用的真正解决方案.

是否有任何机构知道您如何指定Hadoop用于连接远程系统的用户?

PS/Hadoop使用默认配置,这意味着在连接到群集时不使用身份验证,并且Kerberos不用于与远程计算机通信.

Chr*_*oop 45

最后我偶然发现了这个常数

static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`
Run Code Online (Sandbox Code Playgroud)

UserGroupInformation class.

将此设置为环境变量,在启动时使用Java系统属性(使用-D)或以编程方式将其设置为System.setProperty("HADOOP_USER_NAME", "hduser");使Hadoop使用您想要的任何用户名来连接到远程Hadoop集群.

  • 您也可以设置环境变量HADOOP_USER_NAME.那也足够了:) (7认同)

vol*_*lhv 6

下面的代码对我来说同样如此

System.setProperty("HADOOP_USER_NAME", "hduser")
Run Code Online (Sandbox Code Playgroud)
UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hduser"); 
ugi.doAs(new PrivilegedExceptionAction<Void>() {
    public Void run() throws Exception {
        Configuration configuration = new Configuration(); 
        configuration.set("hadoop.job.ugi", "hduser");
        int res = ToolRunner.run(configuration, new YourTool(), args);
        return null; 
    }
});
Run Code Online (Sandbox Code Playgroud)