Как запустить приложение Spark Streaming YARN с пользователями только для Kerberos?

#hadoop #hdfs #spark-streaming #hadoop-yarn #kerberos

#hadoop #hdfs #spark-streaming #hadoop-yarn #kerberos

Вопрос:

  1. Проблема: как и ожидалось, пользователи ОС могут запускать и владеть приложением spark streaming. Однако, когда мы пытаемся запустить задание, в котором владелец приложения не является пользователем ОС, spark streaming возвращает ошибку, в которой говорится, что пользователь не найден. Как вы можете видеть на выходе из команды ‘spark-submit’:
 main : run as user is 'user_name'
main : requested yarn user is 'user_name'
User 'user_name' not found
  

Я уже видел эту ошибку на некоторых других форумах, и рекомендация заключалась в создании пользователя ОС, но, к сожалению, здесь это не вариант. В приложениях storm пользователь, работающий только с Kerberos, может использоваться в сочетании с пользователем ОС, но, похоже, в spark это не так.

  1. Что я пробовал до сих пор: самое близкое, что я мог получить, это использовать двух пользователей ОС, где у одного есть доступ для чтения к файлу keytab второго. Я запустил приложение от одного до «олицетворения» второго, и второй отображается как владелец. Ошибок не появляется, поскольку оба являются пользователями ОС, но происходит сбой, когда я использую пользователя только для Kerberos в качестве второго. Далее вы можете увидеть отправленную команду для spark-streaming (кстати, оба они также являются пользователями HDFS, иначе запуск также был бы невозможен):
 spark-submit --master yarn --deploy-mode cluster --keytab /etc/security/keytabs/user_name.keytab 
--principal kerberosOnlyUser@LOCAL 
--files ./spark_jaas.conf#spark_jaas.conf,
./user_name_copy.keytab#user_name_copy.keytab --conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=./spark_jaas.conf" 
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./spark_jaas.conf" 
--driver-java-options "-Djava.security.auth.login.config=./spark_jaas.conf" 
--conf spark.yarn.submit.waitAppCompletion=true --class ...
  

Я также попробовал альтернативу с --proxy-user помощью команды, но была возвращена та же ошибка.

Действительно ли невозможно использовать пользователя только для Kerberos в spark? Или есть обходной путь? Среда:

 Spark 2.3.0 on YARN.
Hadoop 2.7.3.
  

Большое спасибо за вашу помощь!

Комментарии:

1. После аутентификации пользователя (в вашем случае с Kerberos) по умолчанию Hadoop полагается на ОС для получения групп, к которым принадлежит этот пользователь. Если ОС сопоставляет пользователей Kerberos с пользователями Linux (обычно через LDAP, используя SSSD или Centrify) , то это работает из коробки.

2. В вашем случае вы должны изменить конфигурацию Hadoop , чтобы сопоставить группы непосредственно с LDAP => изменить класс Java, настроить каталог LDAP (или каталоги) на tap. Погуглите это.

3. docs.cloudera.com/HDPDocuments/HDP2/HDP-2.6.4/bk_security/…

4. hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/…