前言
在之前的 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive 集群搭建 中介绍了集群的环境搭建,但是在使用 hive 进行数据查询的时候会非常的慢,因为 hive 默认使用的引擎是 MapReduce.因此就将 spark 作为 hive 的引擎来对 hbase 进行查询,在成功的整合之后,我将如何整合的过程写成本篇博文.具体如下!
事前准备
在进行整合之前,首先确保 Hive,HBase,Spark 的环境已经搭建成功!如果没有成功搭建,具体可以看我之前写的 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive 集群搭建 这篇文章.
那么开始将 hive,hbase,spark 整合吧.
目前集群的配置如下:
Hive 整合 HBase
因为 Hive 与 HBase 整合的实现是利用两者本身对外的 API 接口互相通信来完成的,其具体工作交由 Hive 的 lib 目录中的
hive - hbase - handler - *.jar
工具类来实现.所以只需要将 hive 的
hive - hbase - handler - *.jar
复制到 hbase/lib 中就可以了.
切换到 hive/lib 目录下
输入:
cp hive - hbase - handler - *.jar / opt / hbase / hbase1.2 / lib
注: 如果在 hive 整合 hbase 中,出现版本之类的问题,那么以 hbase 的版本为主,将 hbase 中的 jar 包覆盖 hive 的 jar 包.
至于 Hive 和 HBase 之间的相关测试可以查看我之前的 大数据学习系列之五 ----- Hive 整合 HBase 图文详解 这篇文章,本篇就不再过多描述了.
Hive 整合 Spark
其实 Hive 整合 Spark 其实就是 Hive 使用 Spark 成功编译好的架包,但是 Hive 整合 Spark 比较坑的是版本不能随意,必须使用指定的进行编译.当初因为这个问题困扰了很久,最后查阅资料找到了已经编译好的 spark 和 hive 的版本,我们只需要将编译好的 jar 拿过来进行使用就行了.具体使用如下.
hive 的配置更改
切换到 hive/conf 目录下
编辑 hive-env.sh 文件
添加 spark 的环境:
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;
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 on HBase 使用 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
来源: https://www.cnblogs.com/xuwujing/p/8322022.html