我正在使用YarnClient以编程方式启动作业。我正在运行的集群已经被kerberos化了。
法线贴图减少通过“yarn jar examples.jar wordcount ...”工作提交的作业。
我试图以编程方式提交的工作,但不是。我收到这个错误:
14/09/04 21:14:29错误client.ClientService:应用程序提交期间发生错误:应用程序application_1409863263326_0002因AM容器因为appattempt_1409863263326_0002_000002退出而失败了2次,退出时使用exitCode:-1000由于:本地异常失败:java .io.IOException:org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS];主机详情:本地主机是:“yarn-c1-n1.clouddev.snaplogic.com/10.184.28.108”;目的地主机是:“yarn-c1-cdh.clouddev.snaplogic.com”:8020; 这次尝试失败了。申请失败了。 14/09/04 21:14:29 ERROR 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()));
或许可以缓解我的困境,但这似乎也没有帮助。任何帮助将不胜感激。
答案 0 :(得分:4)
好吧,经过几个小时,几个小时和几个小时后,我们才明白这一点。对于后来的所有编码人员,他们一直困扰着hadoop缺乏文档:
您必须通过调用获取凭据来从UserGroupInformation对象中获取令牌。然后,您必须在ContainerLaunchContext上设置标记。
答案 1 :(得分:0)
如果在任何hdfs路径中使用实际名称节点而不是HA的逻辑URI,则也会出现此错误。
这是因为如果找到namenode uri而不是逻辑uri那么它将创建非HA文件系统,它将尝试使用简单的UGI而不是kerberos UGI。
答案 2 :(得分:0)
相同的错误与hadoop工件版本不兼容。
工作示例:
public static final String CONF_CORE_SITE = "/etc/hadoop/conf/core-site.xml";
public static final String CONF_HDFS_SITE = "/etc/hadoop/conf/hdfs-site.xml";
/**
* Pick the config files from class path
*/
private static Configuration getHdfsConfiguration() throws IOException {
Configuration configuration = new Configuration();
configuration.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
configuration.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
File hadoopCoreConfig = new File(CONF_CORE_SITE);
File hadoopHdfsConfig = new File(CONF_HDFS_SITE);
if (! hadoopCoreConfig.exists() || ! hadoopHdfsConfig.exists()) {
throw new FileNotFoundException("Files core-site.xml or hdfs-site.xml are not found. Check /etc/hadoop/conf/ path.");
}
configuration.addResource(new Path(hadoopCoreConfig.toURI()));
configuration.addResource(new Path(hadoopHdfsConfig.toURI()));
//Use existing security context created by $ kinit
UserGroupInformation.setConfiguration(configuration);
UserGroupInformation.loginUserFromSubject(null);
return configuration;
}
pom.xml
<properties>
<hadoop.version>2.6.0</hadoop.version>
<hadoop.release>cdh5.14.2</hadoop.release>
</properties>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>${hadoop.version}-mr1-${hadoop.release}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}-${hadoop.release}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}-${hadoop.release}</version>
</dependency>