Я пытаюсь заставить искровой кластер писать на SQL-сервер с помощью JavaKerberos с драйвером JDBC от Microsoft (v7.0.0) (т. е. я указываю integratedSecurity=true;authenticationScheme=JavaKerberos
в строке подключения) с учетными данными, указанными в файле keyTab, и у меня нет большого успеха ( проблема такая же, если я указываю учетные данные в строке подключения).
Я отправляю задание в кластер (4-узловой режим YARN 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», похоже, указаны правильно, поскольку они работают для драйвера.
- Я вижу в пользовательском интерфейсе искры, что исполнители выбирают правильные параметры командной строки:
-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf
После большого количества протоколирования/отладки разницы в поведении искрового драйвера и исполнителя, кажется, что исполнитель пытается использовать неправильные учетные данные, даже если указанные параметры должны заставить его использовать те, которые указаны в keytab, как он успешно работает с драйвером spark. (Вот почему он генерирует это конкретное исключение, которое он делает, если я пытаюсь намеренно ввести неправильные учетные данные.)
Как ни странно, я вижу в выводе отладки, что драйвер JDBC находит и читает файл SQLJDBCDriver.conf, и должен быть представлен keytab (в противном случае я получаю, что файл не найден), но затем он сразу же игнорирует их и пытается использовать поведение по умолчанию/локальный пользователь реквизиты для входа.
Может ли кто-нибудь помочь мне понять, как я могу заставить исполнителей использовать учетные данные, указанные в keytab, или иным образом получить аутентификацию JavaKerberos/SQL Server для работы со Spark?