Spark как механизм исполнения с Hive

Можно ли использовать Spark 2.4.2 в качестве механизма выполнения с hive 2.3.4 в Amazon EMR?

Я связал файлы jar с ульем (scala-library, spark-core, spark-common-network) с помощью следующих команд:

cd $HIVE_HOME/lib
ln -s $SPARK_HOME/jars/spark-network-common_2.11-2.4.2.jar
ln -s $SPARK_HOME/jars/spark-core_2.11-2.4.2.jar
ln -s $SPARK_HOME/jars/scala-library-2.11.12.jar

В hive-site.xml добавлены следующие настройки:

<property>
    <name>hive.execution.engine</name>
    <value>spark</value>
    <description>Use Map Reduce as default execution engine</description>
</property>
<property>
    <name>spark.master</name>
    <value>spark://<EMR hostname>:7077</value>
  </property>
<property>
    <name>spark.eventLog.enabled</name>
    <value>true</value>
  </property>
<property>
    <name>spark.eventLog.dir</name>
    <value>/tmp</value>
  </property>
<property>
    <name>spark.serializer</name>
    <value>org.apache.spark.serializer.KryoSerializer</value>
  </property>
<property>
  <name>spark.yarn.jars</name>
  <value>hdfs://<EMR hostname>:54310/spark-jars/*</value>
</property>

Spark запущен и работает, и я также могу использовать запросы hive с pyspark. Но когда я пытаюсь использовать Spark в качестве механизма выполнения с hive с вышеупомянутыми конфигурациями, он выдает следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Iterable
    at org.apache.hadoop.hive.ql.optimizer.spark.SetSparkReducerParallelism.getSparkMemoryAndCores(SetSparkReducerParallelism.java:236)
    at org.apache.hadoop.hive.ql.optimizer.spark.SetSparkReducerParallelism.process(SetSparkReducerParallelism.java:173)
    at org.apache.hadoop.hive.ql.lib.DefaultRuleDispatcher.dispatch(DefaultRuleDispatcher.java:90)
    at org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.dispatchAndReturn(DefaultGraphWalker.java:105)
    at org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.dispatch(DefaultGraphWalker.java:89)
    at org.apache.hadoop.hive.ql.lib.PreOrderWalker.walk(PreOrderWalker.java:56)
    at org.apache.hadoop.hive.ql.lib.PreOrderWalker.walk(PreOrderWalker.java:61)
    at org.apache.hadoop.hive.ql.lib.PreOrderWalker.walk(PreOrderWalker.java:61)
    at org.apache.hadoop.hive.ql.lib.PreOrderWalker.walk(PreOrderWalker.java:61)
    at org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.startWalking(DefaultGraphWalker.java:120)
    at org.apache.hadoop.hive.ql.parse.spark.SparkCompiler.runSetReducerParallelism(SparkCompiler.java:288)
    at org.apache.hadoop.hive.ql.parse.spark.SparkCompiler.optimizeOperatorPlan(SparkCompiler.java:122)
    at org.apache.hadoop.hive.ql.parse.TaskCompiler.compile(TaskCompiler.java:140)
    at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:11293)
    at org.apache.hadoop.hive.ql.parse.CalcitePlanner.analyzeInternal(CalcitePlanner.java:286)
    at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:258)
    at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:512)
    at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1317)
    at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1457)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1237)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1227)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:233)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:184)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:403)
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:821)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
    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.hadoop.util.RunJar.run(RunJar.java:239)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Caused by: java.lang.ClassNotFoundException: scala.collection.Iterable
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 33 more

Это ошибка конфигурации или ошибка несовместимости версий?

Также hive отлично работает с tez ...


person Shubham Gupta    schedule 01.07.2019    source источник


Ответы (1)


Это явное указание на несоответствия библиотек scala jar, которые использует куст, поскольку вы используете несовместимые изменения scala для куста с опцией Spark.

Tez doestnt использует Spark и Scala, поэтому он работает нормально. Spark использует scala как lang и не может найти нужную версию. это причина, по которой вы получаете

java.lang.NoClassDefFoundError: scala/collection/Iterable

Это очень распространенная проблема, когда вы используете улей с искрой в качестве механизма выполнения ...

Шаги:.


1) перейти к $ HIVE_HOME / bin / hive

2) сделайте резервную копию файла перед редактированием $ HIVE_HOME / bin / hive
3) возьмите переменную classpath и сначала добавьте все jar-файлы улья

CLASSPATH=${CLASSPATH}:${HIVE_LIB}/*.jar
for f in ${HIVE_LIB}/*.jar; do
    CLASSPATH=${CLASSPATH}:$f;
done

Добавьте искровую библиотеку в путь к классам улья, как показано ниже, в переменной пути к классам, в которой есть все библиотеки улья.

for f in ${SPARK_HOME}/jars/*.jar; do
     CLASSPATH=${CLASSPATH}:$f;
done

Теперь у нас есть hive jar и spark jar в одной и той же переменной classpath. Spark jars имеет библиотеки scala, которые можно использовать с Spark, и нет проблем с совместимостью версий.

3) Теперь измените механизм выполнения улья, чтобы он указывал на искру в hive-site.xml, о котором вы уже знаете ... / выполнение

<property>
    <name>hive.execution.engine</name>
    <value>spark</value>
    <description>Use Map Reduce as default execution engine</description>
</property>
  • Другой вариант - использовать программные ссылки, как в примере ниже ...

Связывание файлов Jar Теперь мы создаем программные ссылки на определенные jar-файлы Spark, чтобы Hive мог их найти:

ln -s /usr/share/spark/spark-2.2.0/dist/jars/spark-network-common_2.11-2.2.0.jar /usr/local/hive/apache-hive-2.3.0-bin/lib/spark-network-common_2.11-2.2.0.jar
ln -s /usr/share/spark/spark-2.2.0/dist/jars/spark-core_2.11-2.2.0.jar /usr/local/hive/apache-hive-2.3.0-bin/lib/spark-core_2.11-2.2.0.jar
ln -s /usr/share/spark/spark-2.2.0/dist/jars/scala-library-2.11.8.jar /usr/local/hive/apache-hive-2.3.0-bin/lib/scala-library-2.11.8.jar
  • Заключение: в любом случае вам нужно убедиться, что правильные jar-файлы scala указывают на улей, который используется искрой в качестве механизма выполнения ...
person Ram Ghadiyaram    schedule 01.07.2019
comment
привет было полезно? если вы в порядке, примите ответ как владелец и голосование - person Ram Ghadiyaram; 01.07.2019
comment
Я сталкивался с этими решениями заранее, но я хотел узнать, совместима ли Spark 2.4.2 с hive 2.3.4 ... Потому что я добавил файлы jar, доступные в каталоге spark jars, только с помощью команды ln -s. В папке jars доступны следующие jar-файлы: spark-network-common_2.11-2.4.2.jar spark-core_2.11-2.4.2.jar scala-library-2.11.12.jar - person Shubham Gupta; 02.07.2019
comment
забыть о связывании jar-файлов, вы выполнили шаги? - person Ram Ghadiyaram; 02.07.2019
comment
На самом деле, я не понял первое решение, которое вы упомянули (я попытался скопировать оба блока кодов, которые вы упомянули на 2-м шаге, в конец моего файла $ HIVE_HOME / bin / hive), а затем запустить hive ... Это не сработало ... - person Shubham Gupta; 02.07.2019
comment
Кроме того, я обнаружил, что при связывании банок произошла некоторая ошибка пути ... Но искра все еще не может подключиться как механизм выполнения к улью. Я сформулировал это как отдельный вопрос: stackoverflow.com/questions/56853923/ - person Shubham Gupta; 02.07.2019
comment
скопируйте библиотеку scala в папку hive / jars, где установлен улей. и запустите первое решение ... и разместите здесь - person Ram Ghadiyaram; 02.07.2019
comment
это просто понять, в основном нам нужно добавить все искровые банки, включая библиотеку scala, в путь класса куста. просто повторите то, что вы делаете, в сценарии оболочки, который вы можете понять. - person Ram Ghadiyaram; 02.07.2019