У меня есть кластер Kerberized с HDFS, HBASE, YARN et c. Из моей Java программы (запущенной на моем p c) мне нужно подключиться к Yarn с помощью библиотеки yarn-client, чтобы получить информацию ResourceManager об очередях. Вот что я делаю:
Main:
System.setProperty("java.security.krb5.conf", "src/main/resources/krb5.conf"); //all
System.setProperty("java.security.krb5.realm", "XXXXX"); //all
System.setProperty("java.security.krb5.kdc", "manager01.xxxxxx"); //all
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); //all
System.setProperty("sun.security.krb5.debug", "true");
YarnClient yc = YarnClient.createYarnClient();
yc.init(YarnClientConfiguration.getConfiguration());
yc.start();
System.out.println(yc.getQueueAclsInfo());
В YarnClientConfiguration:
public static Configuration getConfiguration(){
Configuration config = new Configuration();
config.set("hadoop.security.authentication", "kerberos");
config.set("yarn.security.authentication", "kerberos");
config.set("hadoop.zk.address", "master01.xxxxx:2181,master02.xxxxx:2181,master03.xxxx:2181");
config.set("zookeeper.znode.parent", "/atsv2-hbase-secure");
config.set("hadoop.rpc.protection", "authentication");
config.set("hadoop.security.authorization", "true");
config.set("hbase.master.kerberos.principal", "yarn-ats-hbase/_HOST@XXXXX");
config.set("hbase.master.keytab.file", "/etc/security/keytabs/yarn-ats.xxxxxx.service.keytab");
config.set("hbase.regionserver.kerberos.principal", "yarn-ats-hbase/_HOST@XXXXX");
config.set("hbase.regionserver.keytab.file", "/etc/security/keytabs/xxxxx.keytab");
config.set("yarn_ats_principal_name", "yarn-ats-xxxx@XXXXX");
config.set("yarn_ats_user_keytab", "/etc/security/keytabs/yarn-ats.xxx.headless.keytab");
config.set("yarn.resourcemanager.address", "xxxxxxx:8050");
config.set("yarn.resourcemanager.admin.address", "xxxxxxx:8141");
config.set("yarn.resourcemanager.hostname", "xxxxxxx");
config.set("yarn.resourcemanager.scheduler.address", "xxxxxxx:8030");
config.set("yarn.resourcemanager.resource-tracker.address", "xxxxxxx:8025");
config.set("fs.defaultFS", "hdfs://xxxxxxx:8020");
return config;
}
Я знаю некоторые из параметров, которые я установил в Конфигурации, бесполезны, но независимо от того, что дает мне, всегда одна и та же ошибка:
org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS], while invoking ApplicationClientProtocolPBClientImpl.getQueueUserAcls over null after 1 failover attempts. Trying to failover after sleeping for 15129ms.
Но с одним и тем же KRB5 я могу подключаться к HBASE и HDFS, используя олицетворение. Я попытался поместить код YarnClient в метод Run doAs()
после получения UGI следующим образом:
UserGroupInformation login = UserGroupInformation.loginUserFromKeytabAndReturnUGI(
Constants.PRINCIPAL,
Constants.KEYTAB);
return UserGroupInformation.createProxyUser("test", login);
Но все равно не работает, Что мне не хватает? Использование одного и того же «материала» работает для HDFS и HBASE, поэтому не может быть проблемой Kerberos.
PS попытался также использовать класс YarnConfiguration
вместо конфигурации, но это ничего не меняет.