Hive on Spark

2016-07-06 09:01:00   作者:MangoCool   来源:MangoCool

虽然从Hive-1.1之后就开始支持将Spark作为执行引擎,默认Hive on Spark支持Spark On Yarn模式,但使用起来并没有那么一帆风顺。折腾了一周才搞定,记录一下,以免自己忘了。

根据官网的描述有两点比较重要:

1、版本必须严格匹配:

Hive root pom.xml's <spark.version> defines what version of Spark it was built/tested with.

具体使用哪个版本的Spark编译,要根据你使用的Hive版本来确定,可以根据Hive源码中pom.xml中的Spark版本spark.version确定。

注:本人测试过,只要大版本匹配就行,小版本不影响。如:我使用Hive-2.1.0,Spark-1.6.x都行。

2、Spark使用的jar包,不能包含Hive的jar,也就是编译Spark不能将Hive加入编译:

Note that you must have a version of Spark which does not include the Hive jars. Meaning one which was not built with the Hive profile.

注:编译时不加入参数-Phive即可。


我使用的版本分别是:

Hadoop-2.7.2

Spark-1.6.0

Hive-2.1.0


Spark

下载Spark-1.6.0的源码

地址:http://d3kbcqa49mib13.cloudfront.net/spark-1.6.0.tgz

执行编译:

./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
注:因为Hive存储采用了Parquet,所以编译加入了parquet-provided此参数。

这是一个很漫长的过程,尤其是下载各种依赖需要耗费大量时间,除非你有翻墙或者网络暴给力。

更多方式见官网:http://spark.apache.org/docs/latest/building-spark.html


添加Spark依赖,有三种方式

1、添加配置至hive-site.xml中

<property>
  <name>spark.home</name>
  <value>/your/sparkhome</value>
</property>

2、启动Hive CLI/HiveServer2前,配置SPARK_HONE到环境变量

export SPARK_HOME=/your/sparkhome

3、直接将编译好的Spark安装包中lib目录下的spark-assembly-*.jar包添加至HIVE_HOME/lib中,这种方式貌似最方便。


配置Hive执行引擎:

添加配置至hive-site.xml中

<property>
    <name>hive.execution.engine</name>
    <value>spark</value>
</property>


配置Spark应用配置:

set spark.master=<Spark Master URL>
set spark.eventLog.enabled=true;
set spark.eventLog.dir=<Spark event log folder (must exist)>
set spark.executor.memory=512m;             
set spark.serializer=org.apache.spark.serializer.KryoSerializer;
可以将这段配置加入spark-default.conf中,也可以直接配置到hive-site.xml中,似乎更方便,以下是我hive-site.xml的配置。
<property>
    <name>spark.master</name>
    <value>spark://hostname/ip:7077</value>
</property>

<property>
    <name>spark.eventLog.enabled</name>
    <value>true</value>
</property>

<property>
    <name>spark.eventLog.dir</name>
    <value>/home/hadoop/SW/spark/hiveOnSparkLogs</value>
</property>

<property>
    <name>spark.executor.memory</name>
    <value>512m</value>
</property>

<property>
    <name>spark.serializer</name>
    <value>org.apache.spark.serializer.KryoSerializer</value>
</property>

启动Hive即可!


这里留下一个问题,也是本人为暂时未解决的:

当配置好Hive on Spark后,启动spark-shell,执行Spark sql命令报错:

java.lang.NoClassDefFoundError: org/apache/parquet/hadoop/ParquetOutputCommitter
	at org.apache.spark.sql.SQLConf$.<init>(SQLConf.scala:319)
	at org.apache.spark.sql.SQLConf$.<clinit>(SQLConf.scala)
	at org.apache.spark.sql.SQLContext.<init>(SQLContext.scala:85)
	at org.apache.spark.sql.SQLContext.<init>(SQLContext.scala:77)
	at org.apache.spark.repl.SparkILoop.createSQLContext(SparkILoop.scala:1033)
	at $iwC$$iwC.<init>(<console>:15)
	at $iwC.<init>(<console>:24)

我在想是不是因为编译Spark时没有将Hive集成,所以造成配置好Hive on Spark后没有办法使用Spark直接访问Hive?

Hive on Spark与Spark on Hive是否矛盾?

望交流,解惑!


参考来源:

https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started

标签: Hive Spark engine

分享:

上一篇javax.jdo.JDODataStoreException: Required table missing : "`VERSION`" in Catalog "" Schema "".

下一篇org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist

关于我

一个喜欢唱歌,热衷旅行,爱好电子产品的码农。没事,跟三五好友吼上几嗓子,约上几个背着行囊去露营或者宅在家里抱着孩子敲代码。

座右铭:当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

            人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。


Copyright 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。