客户端无法通过:[令牌,kerberos]进行身份验证

pvabu6sv  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(682)

我正在使用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()));

也许可以减轻我的痛苦,但这似乎也没有帮助。任何帮助都将不胜感激。

bejyjqdl

bejyjqdl1#

好吧,过了好几个小时,我们终于弄明白了。对于所有后来的代码编写者来说,hadoop缺乏文档永远困扰着他们:
必须通过调用从usergroupinformation对象获取令牌才能获取凭据。然后必须在containerlaunchcontext上设置标记。

qojgxg4l

qojgxg4l2#

如果在任何hdfs路径中使用实际名称节点而不是ha的逻辑uri,也会出现此错误。
这是因为如果它找到一个namenode uri而不是逻辑uri,那么它将创建非ha文件系统,该文件系统将尝试使用简单的ugi而不是kerberos ugi。

h5qlskok

h5qlskok3#

与不兼容的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>

相关问题