Оказалось, что Hive-on-Spark имеет много проблем с реализацией и, по сути, вообще не работает, если вы не напишите свой собственный коннектор Hive.Короче говоря, разработчики Spark изо всех сил пытаются не отставать от выпусков Hive, и они еще не решили, как бороться с обратной совместимостью о том, как загрузить версии Hive ~ <2, сосредотачиваясь на самой новой ветви. </em>
Решения
1) Вернитесь в Улей 1.x
Не идеально.Особенно, если вы хотите более современную интеграцию с форматами файлов, такими как ORC.
2) Используйте Hive-on-Tez
Это тот, который мы решили принять.*This solution does not break the open source stack*
и отлично работает вместе с Spark-on-Yarn.В сторонних экосистемах Hadoop, таких как Azure, AWS и Hortonworks, добавлен собственный код только для запуска Hive-On-Spark из-за беспорядка, которым он стал.
После установки Tez ваши запросы Hadoop будут работать следующим образом:
- Прямой запрос Hive (например, соединение jdbc из DBeaver) запустит контейнер Tez в кластере
- A Задание Spark будет иметь доступ к метасольве Hive в обычном режиме и будет использовать контейнер Spark в кластере при создании
SparkSession.builder.enableHiveSupport().getOrCreate()
(это код pyspark)
Установка Hive-on-Tez сSpark-on-Yarn
Примечание: Я буду коротким, поскольку не вижу большого интереса к этим платам.Попросите подробности, и я буду рад помочь и расширить.
Версия матрицы
Hadoop 2.9.2
Tez 0.9.2
Hive 2.3.4
Spark 2.4.2
Hadoop установлен в режиме кластера.
Это то, что сработало для нас.Я не ожидал бы, что он будет работать без проблем при переходе на Hadoop 3.x, что мы будем делать в будущем, но он должен работать нормально, если вы не измените основную версию выпуска для каждого компонента.
Основное руководство
- Скомпилируйте Tez из исходного кода, как написано в официальном руководстве по установке , с режимом A для обмена файлами Jadoop.Не используйте предварительно скомпилированный дистрибутив Tez.Протестируйте его с помощью оболочки улья с помощью простого запроса, который не является простым доступом к данным (т. Е. Просто выбором).Например, используйте:
select count(*) from myDb.myTable
.Вы должны увидеть панели Tez с консоли улья. - Скомпилируйте Spark из исходного кода.Для этого следуйте официальному руководству ( Важно: скачайте архив с пометкой без-hadoop !! ), но перед компиляцией отредактируйте исходный код на
./sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala
и закомментируйте следующую строку: ConfVars.HIVE_STATS_JDBC_TIMEOUT -> TimeUnit.SECONDS,
- Поделиться
$HIVE_HOME/conf/hive-site.xml
, в вашем $SPARK_HOME/conf/
dir.Вы должны сделать печатную копию этого файла конфигурации, а не символическую ссылку.Причина в том, что вы должны удалить все значения конфигурации Hive , связанные с Tez, чтобы гарантировать независимое сосуществование Spark с Tez, как описано выше.Это включает свойство hive.execution.engine=tez
, которое должно быть пустым.Просто полностью удалите его из файла Spark hive-site.xml, оставив его в файле hive-site.xml. - В
$HADOOP_HOME/etc/hadoop/mapred-site.xml
установить свойство mapreduce.framework.name=yarn
.Это будет правильно воспринято обеими средами, даже если оно не установлено на yarn-tez
.Это просто означает, что необработанные задания mapreduce не будут выполняться на Tez, а задания Hive действительно будут его использовать.Это проблема только для устаревших заданий, так как raw mapred устарела.
Удачи!