我正在使用yarnclient以编程方式启动作业。我正在运行的群集已被kerberos化。
普通Map减少通过“yarn jar examples.jar wordcount…”工作提交的作业。
我试图以编程方式提交的工作没有。我得到这个错误:
14/09/04 21:14:29 error client.clientservice:应用程序提交期间发生错误:应用程序应用程序\u 1409863263326 \u 0002由于appattempt的am容器而失败2次\u 1409863263326 \u 0002 \u000002退出,exitcode:-1000原因:本地异常失败:java.io.ioexception:org.apache.hadoop.security.accesscontrolexception:client无法通过:[令牌,kerberos]进行身份验证;主机详细信息:本地主机是:“yarn-c1-n1.clouddev.snaplogic.com/10.184.28.108”;目标主机是:“yarn-c1-cdh.clouddev.snaplogic.com”:8020。尝试失败。。应用程序失败。14/09/04 21:14:29错误client.yclient:应用程序提交失败
代码如下所示:
ClientContext context = createContextFrom(args);
YarnConfiguration configuration = new YarnConfiguration();
YarnClient yarnClient = YarnClient.createYarnClient();
yarnClient.init(configuration);
ClientService client = new ClientService(context, yarnClient, new InstallManager(FileSystem.get(configuration)));
LOG.info(Messages.RUNNING_CLIENT_SERVICE);
boolean result = client.execute();
我曾想,也许会添加一些东西,以达到以下效果:
yarnClient.getRMDelegationToken(new Text(InetAddress.getLocalHost().getHostAddress()));
也许可以减轻我的痛苦,但这似乎也没有帮助。任何帮助都将不胜感激。
3条答案
按热度按时间bejyjqdl1#
好吧,过了好几个小时,我们终于弄明白了。对于所有后来的代码编写者来说,hadoop缺乏文档永远困扰着他们:
必须通过调用从usergroupinformation对象获取令牌才能获取凭据。然后必须在containerlaunchcontext上设置标记。
qojgxg4l2#
如果在任何hdfs路径中使用实际名称节点而不是ha的逻辑uri,也会出现此错误。
这是因为如果它找到一个namenode uri而不是逻辑uri,那么它将创建非ha文件系统,该文件系统将尝试使用简单的ugi而不是kerberos ugi。
h5qlskok3#
与不兼容的hadoop工件版本相同的错误。
工作示例:
pom.xml文件