@ 2016-05-30
Hive on Spark,基于Spark的Hive,实质上是将Hive默认的计算引擎MapReduce替换成Spark。Hive on Spark的设置相当简单,但是其中也是各种坑~
环境说明
- CentOS 6.7
- Hadoop 2.7.2
- Hive 2.0.0
- Spark 1.5.0
- Kylin 1.5.1
1. 修改$HIVE_HOME/conf/hive-site.xml
<property>
<name>hive.execution.engine</name>
<value>spark</value>
<description>这个值可以使mr/tez/spark中的一个作为hive的执行引擎,mr是默认值,而tez仅hadoop 2支持</description>
</property>
2. 添加spark-assembly包
注意,起初Spark使用的版本并非1.5.0,当使用其spark-assembly包时,hive无法正常使用spark进行计算,后来查看hive-2.0.0-src中的pom.xml,找到spark的版本为1.5.0,因此自己对spark进行了编译,具体编译方法在末尾小节中。
- 拷贝spark-assembly-1.5.0-hadoop2.6.0.jar到Hive下:
cp $SPARK_HOME/lib/spark-assembly-1.5.0-hadoop2.6.0.jar $HIVE_HOME/lib/
- 测试,进入Hive Cli执行计算语句,如下:
hive> select sum(measure) from tb_fact;
Query ID = nanyue_20160530194626_77f06879-0508-49cc-b4fd-8e4748da4193
Total jobs = 1
Launching Job 1 out of 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Spark Job = 2de6c9eb-b79b-4111-a594-b4c4552440da
Query Hive on Spark job[0] stages:
0
1
Status: Running (Hive on Spark job[0])
Job Progress Format
CurrentTime StageId_StageAttemptId: SucceededTasksCount(+RunningTasksCount-FailedTasksCount)/TotalTasksCount [StageCost]
2016-05-30 19:46:34,737 Stage-0_0: 0(+1)/2 Stage-1_0: 0/1
........
2016-05-30 19:46:48,815 Stage-0_0: 2/2 Finished Stage-1_0: 1/1 Finished
Status: Finished successfully in 18.10 seconds
OK
4.9995E9
Time taken: 22.783 seconds, Fetched: 1 row(s)
3. 额外添加几个jar包
在我的环境下,Hive on Spark和Hive&HBase是同时使用的,且基于此还有Kylin需要使用Hive和HBase,经过测试之后,在.hiverc下添加了下面这些jar包,才使得Hive/HBase/Kylin各组件协调统一的运行正常。
add jar /opt/hbase-1.1.3/lib/htrace-core-3.1.0-incubating.jar;
add jar /opt/hive-2.0.0/lib/hive-metastore-2.0.0.jar;
add jar /opt/hbase-1.1.3/lib/hbase-server-1.1.3.jar;
add jar /opt/hbase-1.1.3/lib/hbase-client-1.1.3.jar;
add jar /opt/hbase-1.1.3/lib/hbase-protocol-1.1.3.jar;
add jar /opt/hive-2.0.0/hcatalog/share/hcatalog/hive-hcatalog-core-2.0.0.jar;
add jar /opt/hive-2.0.0/lib/datanucleus-core-4.1.6.jar;
add jar /opt/hive-2.0.0/lib/datanucleus-api-jdo-4.2.1.jar;
add jar /opt/hive-2.0.0/lib/datanucleus-rdbms-4.1.7.jar;
add jar /opt/hive-2.0.0/lib/hive-cli-2.0.0.jar;
add jar /opt/hive-2.0.0/lib/hive-hbase-handler-2.0.0.jar;
附. 编译spark-assembly包
建议:在大数据平台中,必然会使用到各种各样的开源组件,因此在使用某一组件之前,强烈建议弄清楚该组件的版本中适用于现有组件版本有哪些。开源组件的版本兼容性问题,一直是挖坑利器。
- 预先准备MAVEN环境
下载MAVEN的bin包,设置好环境变量
[mars@master ~]$ echo $MAVEN_HOME
/opt/maven
- 下载对应的Spark源码包,这里下载spark-1.5.0.tgz,解压
- 进入spark-1.5.0,执行mvn编译语句
mvn -Pyarn -Dyarn.version=2.6.0 -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
这里需要指定hadoop和yarn,若指定为2.7.2,编译会报错找不到hadoop-2.7.2,不要添加-Phive相关的参数;编译的时长与网络情况相关,如果失败了,多试几次应该可以的。
4. 编译完成之后可以得到spark-assembly…jar,和几个datanucleus相关的几个包
[mars@master spark-1.5.0]$ ll assembly/target/scala-2.10/
total 179660
-rw-rw-r-- 1 nanyue nanyue 183970627 May 26 10:46 spark-assembly-1.5.0-hadoop2.6.0.jar
[mars@master spark-1.5.0]$ ll lib_managed/jars/
total 3948
-rw-rw-r-- 1 nanyue nanyue 339666 May 26 10:43 datanucleus-api-jdo-3.2.6.jar
-rw-rw-r-- 1 nanyue nanyue 1890075 May 26 10:43 datanucleus-core-3.2.10.jar
-rw-rw-r-- 1 nanyue nanyue 1809447 May 26 10:43 datanucleus-rdbms-3.2.9.jar
在第二步添加spark-assembly包这一步中,使用你自己编译的包,并且在使用编译得到的datanucleus的几个包替换掉$HIVE_HOME/lib/下相同的包。