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"是客户端计算机上的本地登录用户.
我试过了
UserGroupInformation实例的各种组合(代理和普通用户)和-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集群.
下面的代码对我来说同样如此
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)
| 归档时间: |
|
| 查看次数: |
29757 次 |
| 最近记录: |