Клиент не может пройти аутентификацию через:[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.