Hive on Spark ОШИБКА java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS - PullRequest
0 голосов
/ 29 марта 2019

Запуск Hive в Spark с простым запросом select * from table выполняется гладко, но при соединениях и суммах ApplicationMaster возвращает эту трассировку стека для связанного контейнера искры:

2019-03-29 17:23:43 ERROR ApplicationMaster:91 - User class threw exception: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
    at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:47)
    at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:134)
    at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:516)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:706)
2019-03-29 17:23:43 INFO  ApplicationMaster:54 - Final app status: FAILED, exitCode: 13, (reason: User class threw exception: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
    at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:47)
    at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:134)
    at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:516)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:706)
)
2019-03-29 17:23:43 ERROR ApplicationMaster:91 - Uncaught exception: 
org.apache.spark.SparkException: Exception thrown in awaitResult: 
    at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:205)
    at org.apache.spark.deploy.yarn.ApplicationMaster.runDriver(ApplicationMaster.scala:486)
    at org.apache.spark.deploy.yarn.ApplicationMaster.org$apache$spark$deploy$yarn$ApplicationMaster$$runImpl(ApplicationMaster.scala:345)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$2.apply$mcV$sp(ApplicationMaster.scala:260)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$2.apply(ApplicationMaster.scala:260)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$2.apply(ApplicationMaster.scala:260)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$5.run(ApplicationMaster.scala:800)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
    at org.apache.spark.deploy.yarn.ApplicationMaster.doAsUser(ApplicationMaster.scala:799)
    at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:259)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:824)
    at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)
Caused by: java.util.concurrent.ExecutionException: Boxed Error
    at scala.concurrent.impl.Promise$.resolver(Promise.scala:55)
    at scala.concurrent.impl.Promise$.scala$concurrent$impl$Promise$$resolveTry(Promise.scala:47)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:244)
    at scala.concurrent.Promise$class.tryFailure(Promise.scala:112)
    at scala.concurrent.impl.Promise$DefaultPromise.tryFailure(Promise.scala:153)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:724)
Caused by: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
    at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:47)
    at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:134)
    at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:516)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:706)
2019-03-29 17:23:43 INFO  ApplicationMaster:54 - Deleting staging directory hdfs://LOSLDAP01:9000/user/hdfs/.sparkStaging/application_1553880018684_0001
2019-03-29 17:23:43 INFO  ShutdownHookManager:54 - Shutdown hook called

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

Использование: Hadoop 2.9.2 Spark 2.3.0 Hive 2.3.4

Спасибо за помощь.

1 Ответ

0 голосов
/ 04 июля 2019

Оказалось, что 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, что мы будем делать в будущем, но он должен работать нормально, если вы не измените основную версию выпуска для каждого компонента.

Основное руководство

  1. Скомпилируйте Tez из исходного кода, как написано в официальном руководстве по установке , с режимом A для обмена файлами Jadoop.Не используйте предварительно скомпилированный дистрибутив Tez.Протестируйте его с помощью оболочки улья с помощью простого запроса, который не является простым доступом к данным (т. Е. Просто выбором).Например, используйте: select count(*) from myDb.myTable.Вы должны увидеть панели Tez с консоли улья.
  2. Скомпилируйте Spark из исходного кода.Для этого следуйте официальному руководству ( Важно: скачайте архив с пометкой без-hadoop !! ), но перед компиляцией отредактируйте исходный код на ./sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala и закомментируйте следующую строку: ConfVars.HIVE_STATS_JDBC_TIMEOUT -> TimeUnit.SECONDS,
  3. Поделиться $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.
  4. В $HADOOP_HOME/etc/hadoop/mapred-site.xml установить свойство mapreduce.framework.name=yarn.Это будет правильно воспринято обеими средами, даже если оно не установлено на yarn-tez.Это просто означает, что необработанные задания mapreduce не будут выполняться на Tez, а задания Hive действительно будут его использовать.Это проблема только для устаревших заданий, так как raw mapred устарела.

Удачи!

...