在以前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,可是在使用hive进行数据查询的时候会很是的慢,由于hive默认使用的引擎是MapReduce。所以就将spark做为hive的引擎来对hbase进行查询,在成功的整合以后,我将如何整合的过程写成本篇博文。具体以下!html
在进行整合以前,首先确保Hive、HBase、Spark的环境已经搭建成功!若是没有成功搭建,具体能够看我以前写的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 这篇文章。
那么开始将hive、hbase、spark整合吧。
目前集群的配置以下:
java
由于Hive与HBase整合的实现是利用二者自己对外的API接口互相通讯来完成的,其具体工做交由Hive的lib目录中的hive-hbase-handler-*.jar
工具类来实现。因此只须要将hive的 hive-hbase-handler-*.jar
复制到hbase/lib中就能够了。
切换到hive/lib目录下
输入:git
cp hive-hbase-handler-*.jar /opt/hbase/hbase1.2/lib
注: 若是在hive整合hbase中,出现版本之类的问题,那么以hbase的版本为主,将hbase中的jar包覆盖hive的jar包。github
至于Hive和HBase之间的相关测试能够查看我以前的大数据学习系列之五 ----- Hive整合HBase图文详解 这篇文章,本篇就再也不过多描述了。shell
其实Hive整合Spark其实就是Hive使用Spark成功编译好的架包,可是Hive整合Spark比较坑的是版本不能随意,必须使用指定的进行编译。当初由于这个问题困扰了好久,最后查阅资料找到了已经编译好的spark和hive的版本,咱们只须要将编译好的jar拿过来进行使用就好了。具体使用以下。apache
切换到hive/conf 目录下
编辑 hive-env.sh
文件
添加spark的环境:app
export SPARK_HOME=/opt/spark/spark1.6-hadoop2.4-hive
而后编辑 hive-site.xml
文件
在hive-site.xml 添加 这些配置
这些配置的说明:工具
hive.execution.engine: 表示 hive 执行的默认引擎是,这里咱们填的是spark。若是不想 加这个配置,但愿手动使用spark,那么进入hive shell以后,输入:
set hive.execution.engine=spark;
oop
spark.master: spark的主机地址,这里咱们填spark的默认地址。
spark.home: spark 的安装路径,写spark的安装路径。
spark.submit.deployMode:spark的提交方式,默认就写client。
spark.serializer: spark 的序列化方式。
spark.eventLog.enabled:是否使用spark的日志,默认true。
spark.eventLog.dir : spark的日志存放路径,注意这个路径要用hadoop建立!
spark.executor.memory:分配给spark的执行内存,根据我的机器来配置。
spark.driver.memory: spark总内存,根据我的机器来配置。学习
完整配置:
<!-- Hive On Spark 配置 --> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <property> <name>spark.master</name> <value>spark://master:7077</value> </property> <property> <name>spark.home</name> <value>/opt/spark/spark1.6-hadoop2.4-hive</value> </property> <property> <name>spark.submit.deployMode</name> <value>client</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property> <property> <name>spark.eventLog.enabled</name> <value>true</value> </property> <property> <name>spark.eventLog.dir</name> <value>hdfs://master:9000/directory</value> </property> <property> <name>spark.executor.memory</name> <value>10G</value> </property> <property> <name>spark.driver.memory</name> <value>10G</value> </property>
成功配置这些以后,进入hive shell中。
简单进行两个表的关联查询
能够看到hive已经成功使用spark做为引擎了。
在成功整合环境以后,而且创建了两张hive 外联hbase的表以后。进行数据查询测试。
两张表的建立脚本:
create table t_student(id int,name string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,st1:name") tblproperties("hbase.table.name"="t_student","hbase.mapred.output.outputtable" = "t_student"); create table t_student_info(id int,age int,sex string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,st1:age,st1:sex") tblproperties("hbase.table.name"="t_student_info","hbase.mapred.output.outputtable" = "t_student_info");
而后在两张表中个插入插入100万数据测试
注:我这里是在HBase中直接插入100w数据的,使用HBase的Api完成的,具体能够大数据学习系列之三 ----- HBase Java Api 图文详解这篇博文。
成功插入以后,咱们在hive shell中来测试查询速度。
条数测试:
主键管理查询测试:
非主键查询测试:
注:其实也是可使用hive的Api ,就是普通的JDBC链接,只不过链接驱动要换成
Class.forName("org.apache.hive.jdbc.HiveDriver");
具体实现能够看个人github中的代码:https://github.com/xuwujing/pancm_project/blob/master/src/main/java/com/pancm/test/hiveTest/hiveUtil.java
结论: 使用 hive on spark 查询能够看出,若是查询条件是主键,也就是hbase中的rowkey的话,查询100w数据能够在2.3s左右就查出来了(我的感受打开spark估计就要用2s左右,若是量大的话,速度估计也不会很慢), 可是若是使用非主键的条件去查询,就能够看到速度明显变慢了。
因此在使用 hive on hbase 的时候,尽可能使用rowkey进行查询。
其实集群的环境搭建以及整合在我写第一篇大数据学习系列博客的时候就已经搭建好了。至于博客为何写得这么迟,第一点是当初搭建环境的时候,并无真正的理解那些配置的做用;第二点是环境搭建有些莫名其妙,常常出现问题,不过大部分问题和解决反感我都记录并写成博客了,因此慢慢写博客其实也是我的知识的从新整理;第三是我的的精力有限,没法一口气将这些都写成博客,毕竟写博客也须要必定时间和精力的。
完成本篇博文以后,暂时先不写大数据这方面的博客了。感受目前的本身能力还不够,若是就这样勉强的去自学,估计也很难学到知识点,更况且将其写成博客来说解了。因此目前就先放放,有能力以后再来续写!
大数据学习系列的文章:http://blog.csdn.net/column/details/18120.html