У меня есть кластер Hadoop 3.0, настроенный с использованием Kerberos. Все отлично работает и YARN запускается.
Теперь я хочу добавить Spark поверх него и в полной мере использовать Hadoop и безопасность. Для этого я использую бинарный дистрибутив Spark 2.3 и изменил следующее.
В spark-env.sh
:
YARN_CONF_DIR
, укажите папку, в которой находятся мои файлы конфигурации Hadoop core-site.xml
, hdfs-site.xml
и yarn-site.xml
.
В spark-defaults.conf
:
spark.master yarn
spark.submit.deployMode cluster
spark.authenticate true
spark.yarn.principal mysparkprincipal
spark.yarn.keytab mykeytabfile
Если я правильно понял при использовании YARN, секретный ключ будет сгенерирован автоматически, и мне не нужно вручную устанавливать spark.authenticate.secret
.
У меня проблема в том, что работник жалуется на ключ:
java.lang.IllegalArgumentException: A secret key must be specified via the spark.authenticate.secret config
У меня также нет никаких указаний в журналах, что Spark использует YARN или пытается что-то сделать с моим объемом hdfs. Это почти как файлы конфигурации Hadoop полностью игнорируются. Я прочитал документацию по YARN и безопасности для Spark, но мне это не очень понятно.
Мои вопросы:
- Как я могу быть уверен, что Spark использует YARN
- Нужно ли устанавливать
spark.yarn.access.hadoopFileSystems
, если я использую только сервер, установленный в YARN_CONF_DIR
- Лучше ли установить
LOCAL_DIRS
на HDFS, и если да, то каков синтаксис
- Нужны ли мне
HADOOP_CONF_DIR
и YARN_CONF_DIR
?
Редактировать / Добавить:
После просмотра исходного кода исключение составляет SASL, который не включен для Spark, поэтому я не понимаю.
В моем Hadoop включен SSL ( Конфиденциальность данных ), и, поскольку я предоставляю Spark конфигурацию моего сервера, возможно, для SSL требуется SSL для Spark, если в конфигурации для Hadoop он включен.
Пока я действительно запутался во всем.
- В нем говорится, что переменные окружения должны быть установлены с использованием
spark.yarn.appMasterEnv
. Но какой? Все они?
- Также говорится, что это файл Hadoop CLIENT, который мне нужно иметь на пути к классам, но какие свойства должны присутствовать в файле CLIENT?
Я предполагаю, что могу заменить файлы XML, используя
spark.hadoop.*
свойства, но какие свойства необходимы Spark, чтобы знать, где находится мой кластер YARN?
- Установка
spark.authenticate.enableSaslEncryption
в false, кажется, не имеет никакого эффекта, поскольку исключение все еще составляет SparkSaslClient
Исключение составляет:
java.lang.IllegalArgumentException: A secret key must be specified via the spark.authenticate.secret config
at org.apache.spark.SecurityManager$$anonfun$getSecretKey$4.apply(SecurityManager.scala:510)
at org.apache.spark.SecurityManager$$anonfun$getSecretKey$4.apply(SecurityManager.scala:510)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.SecurityManager.getSecretKey(SecurityManager.scala:509)
at org.apache.spark.SecurityManager.getSecretKey(SecurityManager.scala:551)
at org.apache.spark.network.sasl.SparkSaslClient$ClientCallbackHandler.handle(SparkSaslClient.java:137)
at com.sun.security.sasl.digest.DigestMD5Client.processChallenge(DigestMD5Client.java:337)
at com.sun.security.sasl.digest.DigestMD5Client.evaluateChallenge(DigestMD5Client.java:220)
at org.apache.spark.network.sasl.SparkSaslClient.response(SparkSaslClient.java:98)
at org.apache.spark.network.sasl.SaslClientBootstrap.doBootstrap(SaslClientBootstrap.java:71)
at org.apache.spark.network.crypto.AuthClientBootstrap.doSaslAuth(AuthClientBootstrap.java:115)
at org.apache.spark.network.crypto.AuthClientBootstrap.doBootstrap(AuthClientBootstrap.java:74)
at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:257)
at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:187)
at org.apache.spark.rpc.netty.NettyRpcEnv.createClient(NettyRpcEnv.scala:198)
at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:194)
at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:190)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)