Я пытаюсь получить спарк-кластер для записи на сервер 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?