Клиент не может пройти аутентификацию через:[TOKEN, KERBEROS]

Я использую YarnClient, чтобы программно начать работу. Кластер, на котором я работаю, был определен как Kerberos.

Карта нормалей сокращает количество заданий, отправленных с помощью работы "yarn jar examples.jar wordcount...".

Работа, которую я пытаюсь представить программно, не делает. Я получаю эту ошибку:

14/09/04 21:14:29 ОШИБКА client.ClientService: Произошла ошибка во время отправки приложения: приложение application_1409863263326_0002 не удалось 2 раза из-за того, что AM-контейнер для appattempt_1409863263326_0002_000002 завершился с 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 ОШИБКА 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 ответа

Хорошо, хорошо после нескольких часов и часов мы поняли это. Для всех следующих поколений кодеров, вечно страдающих от отсутствия документации у hadoop:

Вы должны получить токены из объекта UserGroupInformation с помощью вызова для получения учетных данных. Затем вы должны установить токены для ContainerLaunchContext.

Та же ошибка с несовместимыми версиями артефактов 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>

Вы также получите эту ошибку, если вы используете фактический узел имени вместо логического URI HA в любом пути hdfs.

Это связано с тем, что если он найдет URI-код вместо логического URI, то он создаст файловую систему без HA, которая будет пытаться использовать простой UGI вместо UGI Kerberos.

Другие вопросы по тегам