我有一个与Hadoop交互的Web应用程序。 (Cloudera cdh3u6)特定用户操作应在群集中启动新的Map Reduce作业。
群集不是安全群集,但它使用简单的群组身份验证 - 所以如果我像我一样ssh到它,我可以从命令行启动MR作业。
在Web应用程序中,我使用ToolRunner
来运行我的工作:
MyMapReduceWrapperClass mr = new MyMapReduceWrapperClass();
ToolRunner.run(mr, null);
// inside the run implementation of my wrapper class :
Job job = new Job(conf, "job title");
//set up stuff removed
job.submit();
目前,此作业是作为启动Web应用程序服务器(Tomcat)进程的用户提交的,该用户是此Web服务器上的一个特殊本地帐户,该帐户无权将作业发送到群集。
理想情况下,我希望能够从用户那里获得某种身份并传递它,以便当不同的用户与网络应用/服务进行交互时,我们可以看到谁在调用哪些工作。跳过如何实际协调这些凭证服务的问题,我甚至不知道它会去哪里。
我在Job
上看到我有一个getCredentials()
选项,但是从那里阅读有关令牌/ Kerberos的内容我觉得这是针对安全集群的(我认为我们是不) - 更何况我不认为我的网络服务器安装了Kerberos。这可以修复。但是,听起来似乎预期的用例是添加地图减少作业在运行以访问其他服务时可能想要的秘密 - 而不是像其他人那样运行作业。
我也看到了(较早的?)JobConf
课程,我有能力setUser(String name)
看起来很有希望 - 即使我不知道它需要密码或其他什么 - 但是我找不到关于该功能的更多信息或文档。我尝试了它并没有任何影响 - 作业仍然作为Tomcat用户提交。
还有其他途径可供探索或研究吗?我不在谷歌的关键词。我宁愿没有选择“只是给你的tomcat用户群集权限” - 我不管理那个资产,我不希望这个请求飞。然而,如果从字面上看这是我唯一的选择,我想理解为什么会这样,以便我能够根据需要争辩,获得正确的信息。
答案 0 :(得分:4)
您可以像这样使用UserGroupInformation
类:
UserGroupInformation ugi = UserGroupInformation.createRemoteUser(username);
ugi.doAs(new PrivilegedExceptionAction<MyMapReduceWrapperClass>() {
public Object run() throws Exception {
MyMapReduceWrapperClass mr = new MyMapReduceWrapperClass();
ToolRunner.run(mr, null);
return mr;
}
});