Проверка подлинности JavaKerberos для SQL Server на платформе Spark - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь получить спарк-кластер для записи на сервер SQL, используя JavaKerberos с драйвером JDBC от Microsoft (v7.0.0) (т. Е. Я указываю integratedSecurity=true;authenticationScheme=JavaKerberos в строке подключения) с учетными данными, указанными в файле keyTab, и яне имеет большого успеха (проблема та же, если я указываю учетные данные в строке соединений).

Я отправляю задание в кластер (режим YARN с 4 узлами v 2.3.0) с:

spark-submit --driver-class-path mssql-jdbc-7.0.0.jre8.jar \
--jars /path/to/mssql-jdbc-7.0.0.jre8.jar \
--conf spark.executor.extraClassPath=/path/to/mssql-jdbc-7.0.0.jre8.jar \
--conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf" \
application.jar

Все работает частично: драйвер spark правильно проверяет подлинность и создает таблицу,однако, когда кто-либо из исполнителей приходит, чтобы написать в таблицу, они терпят неудачу с исключением:

java.security.PrivilegedActionException: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)

Наблюдения:

  • Я могу заставить все работатьесли я указываю учетные данные сервера SQL (однако мне нужно использовать встроенную защиту в моем приложении)
  • Файл keytab и файл модуля входа в систему «SQLJDBCDriver.conf», кажется, указаны правильно, так как они работают для драйвера
  • Я вижу, что в пользовательском интерфейсе spark исполнители выбирают правильные параметры командной строки: -Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf

После большого количества регистрации / отладки различий в поведении искрового драйвера и исполнителя кажется, чтодоходит до исполнителя, пытающегося использовать неправильные учетные данные, даже если указанные параметры должны заставить его использовать те, которые указаны в файле keytab, так какCcessful для искрового драйвера.(Вот почему он генерирует это конкретное исключение, что и происходит, если я пытаюсь заведомо неверно указать учетные данные.)

Странно, но в выводе отладки я вижу, что драйвер JDBC находит и читает файл SQLJDBCDriver.conf иkeytab должен представить (в противном случае я получаю файл не найден сбой), но он быстро игнорирует их и пытается использовать поведение по умолчанию / учетные данные локального пользователя.

Может кто-нибудь помочь мне понять, как я могу заставить исполнителей использовать учетные данныепредоставляется в таблице ключей или иным образом заставить аутентификацию JavaKerberos / SQL Server работать со Spark?

1 Ответ

0 голосов
/ 19 октября 2018

Таким образом, очевидно, что аутентификация JDBC Kerberos в настоящее время просто невозможна для исполнителей в соответствии со старой версией JIRA здесь https://issues.apache.org/jira/browse/SPARK-12312. Поведение такое же, как в версии 2.3.2 в соответствии со списком пользователей Spark и моим тестированием.

Обходные пути

  1. Используйте kinit, а затем раздайте кэшированный TGT исполнителям, как описано здесь: https://github.com/LucaCanali/Miscellaneous/blob/master/Spark_Notes/Spark_Executors_Kerberos_HowTo.md. I think эта техника работает только для пользователя, под которым работают искровые исполнители.По крайней мере, я не смог заставить его работать в моем случае использования.
  2. Оберните драйвер jdbc пользовательской версией, которая занимается аутентификацией, а затем вызывает и возвращает соединение от реального драйвера MS JDBC.Подробности здесь: https://datamountaineer.com/2016/01/15/spark-jdbc-sql-server-kerberos/ и соответствующее репо здесь: https://github.com/nabacg/krb5sqljdb. Я получил эту технику для работы, хотя мне пришлось изменить код аутентификации для моего случая.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...