我有一个与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服务器上的特殊本地帐户,无权将作业发送到群集。

理想情况下,我希望能够从用户那里获得某种身份并将其传递出去,以便当不同的用户与Web应用程序/服务进行交互时,我们可以看到谁在从事哪些工作。跳过如何实际协调这些凭证服务的问题,我什至不清楚它的去向。

我看到在Job上我有一个getCredentials()选项,但是通过阅读那里的 token / Kerberos内容,我给人的印象是这是针对安全集群的(我认为我们不是)–更不用说我不认为我的网络服务器已安装Kerberos。那可以解决。但这听起来也似乎是预期的用例是添加一个map reduce作业在访问其他服务时可能想要的 secret -而不是像其他人那样运行该作业。

我还看到,在(较旧的)JobConf类上,我可以对setUser(String name)进行看似有希望的能力-即使我不知道它在哪里需要密码或其他内容-但我找不到关于此的更多信息或文档。功能。我尝试了一下,但没有影响-作业仍以Tomcat用户身份提交。

还有其他探索或研究途径吗?我对Google不感兴趣。我不希望选择“仅授予您的tomcat用户在群集上的权限”选项-我不管理该 Assets ,也不希望该请求发出请求。但是,如果从字面上看这是我唯一的选择,我想理解为什么会这样,以便我可以在拥有正确信息的情况下辩解需求。

最佳答案

您可以像这样使用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;
    }
});

10-07 18:55
查看更多