30

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

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

Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x

...其中“爱丽丝”是客户端计算机上的本地登录用户。

我试过了

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

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

有谁知道您如何指定 Hadoop 使用哪个用户连接到远程系统?

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

4

3 回答 3

47

最后我偶然发现了常数

static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`

UserGroupInformation class.

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

于 2012-06-16T10:08:24.923 回答
6

下面的代码对我有用

System.setProperty("HADOOP_USER_NAME", "hduser")
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; 
    }
});
于 2013-03-21T11:57:59.077 回答
2

我可以通过使用安全模拟功能来解决类似的问题http://hadoop.apache.org/docs/stable1/Secure_Impersonation.html

以下是代码片段

    UserGroupInformation ugi = UserGroupInformation.createProxyUser("hduser", UserGroupInformation.getLoginUser()); 

    ugi.doAs(new PrivilegedExceptionAction() { 
    public Void run() throws Exception { 
      Configuration jobconf = new Configuration(); 
      jobconf.set("fs.default.name", "hdfs://server:hdfsport"); 
      jobconf.set("hadoop.job.ugi", "hduser"); 
      jobconf.set("mapred.job.tracker", "server:jobtracker port"); 
      String[] args = new String[] { "data/input", "data/output" }; 
      ToolRunner.run(jobconf, WordCount.class.newInstance(), args); 
      return null; 
    } });

远程(在我的情况下为 Windows 桌面主机)登录用户 ID 应添加到 core-site.xml 中,如上述 URL 中所述

于 2012-06-26T17:30:17.200 回答