当前位置: 首页 > 知识库问答 >
问题:

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

强才捷
2023-03-14

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

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

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

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

我试过了

  1. 创建用户组信息实例(代理和普通用户)和
  2. 使用Duser设置Java系统属性。name=hduser,将用户更改为envar,并将其作为硬编码系统。setProperty(“user.name”,“hduser”)调用

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

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

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

共有3个答案

段干河
2023-03-14

我可以通过使用安全模拟功能解决类似问题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

安高义
2023-03-14

下面的代码对我的作用与

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; 
    }
});
相旭
2023-03-14

最后我偶然发现了常数

static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`

UserGroupInformation类中。

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

 类似资料:
  • 当我们使用 Tenant2 登录系统,并尝试创建一个新用户 User2。 你不会收到任何错误,但令人惊讶的是,你不能在列表中看到新创建的用户, User2 发生了什么? 由于我们在迁移类中,把 TenantId 的值设置为 1,现在 User2 的 TenantId 也是 1,并且它也是 主租客。 我们需要在已登录的用户中把新用户的 TenantId 设置为同样的值。 修改 UserReposit

  • 自定义成菜单 说明: 1)启用该功能后,直播客户端可以通过自定义菜单的方式加载用户自定义的网页,方便结合自身业务进行交互操作(客户端5.0.0以上版本支持) 问卷设置 说明: 1)在直播管理页面点击 “问卷设置”,启用该功能后,直播客户端可以通过接口请求的方式将用户问卷库中的问卷导入到客户端中使用 2)关于问卷设置的具体功能及使用方法,请参考:问卷接口开发指南 菜单设置 说明: 1)支持对客户端的

  • 问题内容: 我正在尝试设置HTTP客户端,以便它使用代理,但是我不太明白该怎么做。该文档有多个对“代理”的引用,但是似乎没有一个功能允许定义代理。我需要的是这样的: 知道如何在Go中执行此操作吗? 问题答案: lukad是正确的,您可以设置环境变量,如果这样做,Go将默认使用它。 重击: 走: 您还可以构造自己的http.Client,无论环境如何配置,该客户端都必须使用代理: 如果您不能依赖环境

  • WebSocketClient 结构体指针上只有如下两个可设置的字段: Header 字段 用来设置自定义的 HTTP 头信息。 MaxConcurrentRequests 方法 该方法返回最大并发请求数。 SetMaxConcurrentRequests 方法 该方法用于设置最大并发请求数,当并发请求超过该设置之后,后面的请求将会排队等待。该设置默认值为 10。

  • TCPClient 除了包含上面的继承自 SocketClient 的设置以外,还有以下几个可以设置的字段: Linger 字段 用于设置当连接中仍有数据等待发送或接受时的 Close 方法的行为。 如果其值小于 0(默认),Close 方法立即返回,操作系统停止后台数据发送;如果其值等于 0,Close 立刻返回,操作系统丢弃任何未发送或未接收的数据;如果其值大于 0,Close 方法阻塞最多

  • TCPClient 和 UnixClient 这两个结构体包含 SocketClient 这个匿名字段,因此,SocketClient 上的字段和方法都会被继承。 ReadBuffer 字段 设置与连接相关的操作系统接收缓冲区的大小。当为 0 时,表示不进行设置,使用系统默认值。 WriteBuffer 字段 设置与连接相关的操作系统发送缓冲区的大小。当为 0 时,表示不进行设置,使用系统默认值。