Не удается подключиться к серверу Hive с искровым JDBC в кластере Kerberised - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь прочитать данные из одного куста (куст № 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)

1 Ответ

0 голосов
/ 27 мая 2019

Попробуйте использовать это. Я предполагаю, что вы передаете принципал и keytab в spark представить

val principal: String = sparkSession.sparkContext.getConf.get("spark.yarn.principal")
val keytab: String = sparkSession.sparkContext.getConf.get("spark.yarn.keytab")
UserGroupInformation.loginUserFromKeytab(principal, keytab);

Дайте мне знать, если это работает.

...