Я пытаюсь прочитать данные из одного куста (куст № 1) и записать результат в другой куст (куст № 2) (они из 2 разных кластеров).Я не могу использовать один сеанс spark для подключения к Hive, поэтому я буду использовать jdbc для чтения данных и контекст spark Hive для записи данных.
Оба кластера используют kerberos, knox, ranger.
эта партия искры будет запущена в улье № 2
это моя основная ошибка:
GSSException: не предоставлены действительные учетные данные (Уровень механизма: не удалось найтилюбой Kerberos tgt)
Что я уже пробовал:
- Я могу подключиться к серверу улья, используя beeline commande, с режимом обнаружения zookeeper, а также в прямом http.
beeline -u "jdbc:hive2://<hiveServer2Host>:<Port>/<db>;transportMode=http;httpPath=cliservice;ssl=true;sslTrustStore=truststore.jks;trustStorePassword=<psw>;principal=<hive server 2 principal>;"
мой код:
String url = "jdbc:hive2://<hiveServer2Host>:<Port>/<db>;transportMode=http;httpPath=cliservice;ssl=true;sslTrustStore=truststore.jks;trustStorePassword=<psw>;principal=<hive server 2 principal>";
String table = "test";
Properties connectionProperties = new Properties();
Dataset<Row> testDS= spark.read().jdbc(url, table, connectionProperties);
testDS.show();
я пытаюсь добавить какое-либо ручное соединение keberos до JDBC:
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());
conf.set("hadoop.security.authentication", "kerberos");
conf.set("hadoop.rpc.protection", "privacy");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab(args[0], args[1]);
System.out.println("login with: " + UserGroupInformation.getLoginUser());
System.out.println("Current User:" + UserGroupInformation.getCurrentUser());
я хорошо идентифицирован (вЖурнал искры):
Войти с помощью: A@XXX.LOCAL (аутентификация: KERBEROS)
Текущий пользователь: A (аутентификация: SIMPLE)
я также делаю kinit перед искрой submit:
kinit -kt <A_keytabs> <A principal>
klist в порядке
я пытаюсь добавить --keytab и - Principal в spark-submit, но это ничего не меняет.
проблема возникает только с подключением к JDBC, в противном случае я хорошо определен для доступа к ресурсам HDFS, к теме kafka ...
я также пытаюсь подключиться к JDBC с обнаружением zookeeper в режиме java, но это тоже не работает,
java.sql.SQLException: Не удалось открыть транспорт клиента для любого из URI сервера в ZooKeeper: Невозможно прочитать конфигурации HiveServer2 из ZooKeeper
Я использую HDP 2.6.4, Java 8, Spark 2.2.1
ОБНОВЛЕНО: после ответа Самсона:
Я добавляю в систему свойство jass и KBR:
System.setProperty("java.security.auth.login.config", spark_jaas.conf);
System.setProperty("sun.security.jgss.debug", "true");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
System.setProperty("java.security.krb5.realm", <realm from krb5.conf>);
System.setProperty("java.security.krb5.kdc", <kdc from krb5.conf>);
мое приложение не аварийно завершает работу, но я получаю эту ошибку.
GSSException: действительные учетные данные не предоставлены (Уровень механизма: попытка получить новые учетные данные INITIATE не удалась! (null))
Тема поискадля кредита Kerberos V5 INIT (<>, sun.security.jgss.krb5.Krb5InitCredential)