Как правильно настроить Spark 2.4 с помощью пользовательского Hadoop - PullRequest
2 голосов
/ 02 марта 2020

Я бы хотел использовать Spark 2.4.5 (текущая стабильная версия Spark) и Had oop 2.10 (текущая стабильная версия Had oop в серии 2.x). Далее мне нужно получить доступ к HDFS, Hive, S3 и Kafka.

http://spark.apache.org предоставляет Spark 2.4.5, предварительно собранный и связанный с Had oop 2.6 или Had oop 2.7. Другой вариант - использовать Spark с предоставленным пользователем Had oop, поэтому я попробовал его.

Как следствие использования с предоставленным пользователем Had oop , Spark также не включает библиотеки Hive. Там будет ошибка, как здесь: Как создать SparkSession с поддержкой Hive (не с «Классы Hive не найдены»)?

Когда я добавляю spark-hive зависимость от spark-shell (также затрагивается spark-submit ) при использовании

spark.jars.packages=org.apache.spark:spark-hive_2.11:2.4.5

в spark-defaults.conf , я получаю эту ошибку:

20/02/26 11:20:45 ERROR spark.SparkContext: 
Failed to add file:/root/.ivy2/jars/org.apache.avro_avro-mapred-1.8.2.jar to Spark environment
java.io.FileNotFoundException: Jar /root/.ivy2/jars/org.apache.avro_avro-mapred-1.8.2.jar not found
at org.apache.spark.SparkContext.addJarFile$1(SparkContext.scala:1838)
at org.apache.spark.SparkContext.addJar(SparkContext.scala:1868)
at org.apache.spark.SparkContext.$anonfun$new$11(SparkContext.scala:458)
at org.apache.spark.SparkContext.$anonfun$new$11$adapted(SparkContext.scala:458)
at scala.collection.immutable.List.foreach(List.scala:392)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:458)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2520)
at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$5(SparkSession.scala:935)
at scala.Option.getOrElse(Option.scala:189)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:926)
at org.apache.spark.repl.Main$.createSparkSession(Main.scala:106)

, поскольку spark-shell не может обрабатывать классификаторы вместе с зависимостями пакета, см. https://github.com/apache/spark/pull/21339 и https://github.com/apache/spark/pull/17416

Обход проблемы с классификатором выглядит следующим образом:

$ cp .../.ivy2/jars/org.apache.avro_avro-mapred-1.8.2-hadoop2.jar .../.ivy2/jars/org.apache.avro_avro-mapred-1.8.2.jar

, но DevOps не примет это.

Полный список зависимостей выглядит так (я добавил разрывы строк для лучшей читабельности)

root@a5a04d888f85:/opt/spark-2.4.5/conf# cat spark-defaults.conf
spark.jars.packages=com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.10,
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.10,
org.apache.spark:spark-hive_2.11:2.4.5,
org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.5,
org.apache.hadoop:hadoop-aws:2.10.0,
io.delta:delta-core_2.11:0.5.0,
org.postgresql:postgresql:42.2.5,
mysql:mysql-connector-java:8.0.18,
com.datastax.spark:spark-cassandra-connector_2.11:2.4.3,
io.prestosql:presto-jdbc:307

(все работает - кроме Hive)

  • Является ли комбинация Spark 2.4.5 и Had oop 2.10 используется где-нибудь? Как?
  • Как объединить Spark 2.4.5 с предоставленными пользователем Had oop и Had oop 2.9 или 2.10?
  • Нужно ли строить Spark обойти проблему зависимости Hive?

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Предполагая, что вы не хотите запускать Spark-on-YARN - начните с комплекта "Spark 2.4.5 с Had oop 2.7" , затем выберите из библиотеки Had oop обновить из комплекта "Имел oop 2.10.x"

  1. Сбросить spark-yarn / hadoop-yarn-* / hadoop-mapreduce-client-* JAR, потому что они вам не нужны, кроме hadoop-mapreduce-client-core, на который ссылаются операции записи в HDFS и S3 (см. «Процедура фиксации MR» V1 или V2)
    • , вы также можете отказаться от spark-mesos / mesos-* и / или spark-kubernetes / kubernetes-* JAR, в зависимости от того, что вы планируете запускать Spark на
    • , вы также можете отменить spark-hive-thriftserver и hive-* JARS, если вы не планируете запускать экземпляр "thrift server", за исключением hive-metastore, который необходим, как вы можете догадаться, для управления Metastore (либо обычным сервисом Hive Metastore, либо встроенным Metastore в сеансе Spark)
  2. Сброс hadoop-hdfs / hadoop-common / hadoop-auth / hadoop-annotations / htrace-core* / xercesImpl JAR
  3. Заменить на hadoop-hdfs-client / hadoop-common / hadoop-auth / hadoop-annotations / htrace-core* / xercesImpl / stax2-api JAR от Had oop 2.10 (под common/ и common/lib/, или hdfs/ и hdfs/lib/)
  4. Добавьте разъем S3A от Had oop 2.10, т.е. hadoop-aws / jets3t / woodstox-core JAR (до tools/lib/)
  5. загрузка aws-java-sdk с Amazon (не может быть в комплекте с Had oop, потому что это не лицензия Apache, я думаю )
  6. и, наконец, проведите множество тестов ...


Это сработало для меня после некоторых проб и ошибок - с оговоркой: я запустил мои тесты против S3-совместимой системы хранения, но не против «реального» S3 и не против обычной HDFS. И без «настоящего» сервиса Hive Metastore, только встроенного в память и изменчивого Metastore, который Spark запускает по умолчанию.


Для записи, процесс аналогичен предварительным просмотрам Spark 3.0.0 и Had oop 3.2.1, за исключением того, что
  • вам также необходимо обновить guava
  • вам не нужно обновлять xercesImpl, ни htrace-core, ни stax2-api
  • вам больше не нужно jets3t
  • вам нужно сохранить больше hadoop-mapreduce-client-* JAR (вероятно, из-за новых "коммиттеров S3")
2 голосов
/ 06 марта 2020

Кажется, нет простого способа настроить Spark 2.4.5 с предоставленным пользователем Had oop для использования Had oop 2.10.0

В качестве моей задачи на самом деле, чтобы минимизировать проблемы с зависимостями, я решил скомпилировать Spark 2.4.5 против Had oop 2.10.0.

./dev/make-distribution.sh \
  --name hadoop-2.10.0 \
  --tgz \
  -Phadoop-2.7 -Dhadoop.version=hadoop-2.10.0 \
  -Phive -Phive-thriftserver \
  -Pyarn

Теперь Maven работает с зависимостями / классификаторами Hive, и полученный пакет готов к использованию.

По моему личному мнению, компиляция Spark на самом деле проще, чем настройка Spark с предоставленным пользователем Had oop.

Интеграционные тесты пока не выявили никаких проблем, Spark может получить доступ как к HDFS, так и к S3 (MinIO).

...