【问题标题】:Spark as execution engine with HiveSpark 作为 Hive 的执行引擎
【发布时间】:2019-11-12 04:15:49
【问题描述】:

spark 2.4.2 能否在 Amazon EMR 上与 hive 2.3.4 一起用作执行引擎?

我已通过以下命令将 jar 文件与 hive(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 已启动并正在运行,我还可以通过 pyspark 使用 hive 查询。 但是当我尝试使用带有上述配置的 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 完美配合...

【问题讨论】:

    标签: scala apache-spark hadoop hive amazon-emr


    【解决方案1】:

    这清楚地表明了 hive 使用的 scala jar 库不匹配,因为您对带有 spark 选项的 hive 使用了不兼容的 scala 更改。

    Tez 不使用 spark 和 scala,这就是它工作正常的原因。 spark 使用 scala 作为 lang,它无法找到正确的版本。这就是你得到的原因

    java.lang.NoClassDefFoundError: scala/collection/Iterable
    

    当您使用带有 spark 作为执行引擎的 hive 时,这是非常常见的问题...

    步骤:


    1. 转到 $HIVE_HOME/bin/hive

    2. 在编辑 $HIVE_HOME/bin/hive 之前备份文件

    3. 获取类路径变量并首先添加所有 hive jars

      CLASSPATH=${CLASSPATH}:${HIVE_LIB}/.jar 对于 ${HIVE_LIB}/.jar 中的 f;做 类路径=${类路径}:$f; 完成


    将 spark lib 添加到 hive 类路径中,如下面的类路径变量,其中包含所有 hive 库..

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

    现在我们在同一个类路径变量中有 hive jar 和 spark jar。 Spark jars 具有正确使用 spark 的 scala 库,并且不存在版本兼容性问题。

    1. 现在更改 hive 执行引擎以指向您已经知道的 hive-site.xml 中的 spark.../doing

      hive.execution.engine 火花 使用 Spark 作为执行引擎
    • 另一种选择是使用软链接,如下例...

    Link Jar Files 现在我们对某些 Spark jar 文件进行软链接,以便 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
    
    • 结论:在任何情况下,您都需要确保正确的 scala jar 指向 hive,该 hive 被 spark 用作执行引擎...

    【讨论】:

    • 嗨有用吗?如果您可以please accept the answer 作为所有者和vote-up
    • 我事先遇到过这些解决方案,但我想知道 spark 2.4.2 是否与 hive 2.3.4 兼容...因为我通过 ln 添加了 spark jars 目录中可用的 jar 文件 - 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
    • 忘记链接 jars 你按照步骤操作了吗?
    • 实际上,我不明白你提到的第一个解决方案(我试图在我的 $HIVE_HOME/bin/hive 文件末尾复制你在第二步中提到的两个代码块)然后运行蜂巢...它不起作用...
    • 另外,我发现链接 jars 时出现了一些路径错误...但是 spark 仍然无法作为执行引擎与 hive 连接。我把它作为一个单独的问题:stackoverflow.com/questions/56853923/…
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 2017-06-16
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多