我想从一个Java Web应用程序到远程Hadoop集群提交MapReduce作业,但我不能指定哪些用户的工作应该被提交。 我想配置和使用应适用于所有MapReduce作业系统用户。
目前,我不能指定任何用户无论在什么岗位的Hadoop在客户端系统的当前登录用户的用户名下运行。 这会导致错误与消息
Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x
...其中“爱丽丝”是本地,登录用户在客户机上。
我试过了
- 创建的各种组合
UserGroupInformation
实例(两个代理服务器和普通用户)和 - 设置Java系统属性
-Duser.name=hduser
,改变USER
ENVAR作为一个硬编码System.setProperty("user.name", "hduser")
调用。
......无济于事。 关于1)我承认有这些类应该如何使用没有任何线索。 同时请注意,改变了Java系统属性显然不是在Web应用程序使用一个真正的解决方案。
是否有任何身体知道如何指定哪些用户使用Hadoop的连接到远程系统?
PS / Hadoop是使用默认配置意味着连接到群集和了Kerberos不与远程机器通信中使用时不进行认证时使用。
最后,我无意中发现了恒
static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`
在UserGroupInformation class
。
在启动时设置此为环境变量,Java系统属性(使用-D
)或编程方式与System.setProperty("HADOOP_USER_NAME", "hduser");
使任何用户名,你想连接到远程Hadoop集群的Hadoop的使用。
下面的代码对我的作品一样
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;
}
});
我能够通过使用安全的模拟功能,以解决类似的问题, 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;
} });
登录用户ID的远程(在我的情况下windows桌面主机)应在核心site.xml中添加如上述提到的网址