虽然从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
分享:
上一篇javax.jdo.JDODataStoreException: Required table missing : "`VERSION`" in Catalog "" Schema "".
崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。
联系QQ:58742094
联系电话:
工作邮箱:
当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!
人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。
Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号
免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。