1. 原理
图1Hive与HBase交互原理图
Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互间依靠hive-hbase-handler.jar工具类 (Hive Storage Handlers )进行通信。
注意事项:
1、需要的软件有 Hadoop、Hive、Hbase、Zookeeper,Hive与HBase的整合对Hive的版本有要求,所以不要下载.0.6.0以前的老版本,Hive.0.6.0的版本才支持与HBase对接,因此在Hive的lib目录下可以看见多了hive_hbase-handler.jar这个 jar包,它是Hive扩展存储的Handler ,HBase 建议使用 0.20.6的版本。
2. 整合过程
1) 将/home/hadoop/hbase-0.90.6-cdh3u5/hbase-0.90.6-cdh3u5.jar和 /home/hadoop/hive-0.7.0-bin/lib/zookeeper-3.3.5-cdh3u5.jar复制
到/home/hadoop/hive-0.7.0-bin/lib文件夹下面。
注意:如果hive/lib下已经存在这两个文件的其他版本(例如zookeeper-3.3.1.jar),建议删除后使用hbase下的相关版本
2) 修改hive/conf下hive-site.xml文件,若不存在则创建此文件,在此文件底部添加以下内容:
<property>
<name>hive.aux.jars.path</name>
<value>file:///home/hadoop/hive-0.7.0-bin/lib/hive-hbase-handler-0.7.0.jar,file:///home/hadoop/hive-0.7.0-bin/lib/hbase-0.90.6-cdh3u5.jar,file:///home/hadoop/hive-0.7.0-bin/lib/zookeeper-3.3.5-cdh3u5.jar</value>
</property>
3) 拷贝hbase-0.90.6-cdh3u5.jar到所有hadoop节点(包括master)的hadoop/lib下:
pscp -h slaves -l hadoop/home/hadoop/hbase-0.90.6-cdh3u5/hbase-0.90.6-cdh3u5.jar/home/hadoop/hadoop-0.20.2-cdh3u5/lib
注:slaves中包含节点名称列表:
datanode1
datanode2
datanode3
datanode4
datanode6
这里还缺少一个namenode,注意加上。
4) 拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点(包括master)的hadoop/conf下。
pscp -h slaves -l hadoop/home/hadoop/hbase-0.90.6-cdh3u5/conf/hbase-site.xml /home/hadoop/hadoop-0.20.2-cdh3u5/conf
hbase-site.xml文件配置信息参照:
http://blog.csdn.net/kunshan_shenbin/article/details/7209990。
注意,如果3,4两步跳过的话,运行hive时很可能出现如下错误:
3. 运用
1) 在hive中创建一张与hbase关联的表:
CREATE TABLE hbase_table_1(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITHSERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf1:val")TBLPROPERTIES ("hbase.table.name" = "xyz");
"xyz"是通过hive在hbase中创建的表,如果hbase中的表名和hive相同,则可以不用指定hbase.table.name属性;映射属性"hbase.columns.mapping" = ":key,cf1:val" 中的":key"对应着hbase中的row key,"cf1:val"则代表的是hbase的列"cf1:val"。映射是一一对应的。":key”可以放在任何位置,这里放在第一列,表示将hbase_table_1中的第一列映射为row key。
在hbase中可以看到新建的表:
如果此时在hive中把表hbase_table_1删掉,则hbase中对应的xyz表也会一同被删掉。
2)创建一个hive本地表,并导入数据
建表 : CREATE TABLE pokes(foo INT, bar STRING);数据导入:LOAD DATA LOCAL INPATH '/home/hadoop/hive-0.7.0-bin/examples/files/kv1.txt' OVERWRITE INTOTABLE pokes;
注:kv1.txt文件在hive安装目录的examples下,是自带的。
1) 在关联表中插入数据
INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokesWHERE foo=98;
运行成功后,如图所示:
Hive中:
Hbase中:
1) 数据写入HBASE原理
插入数据时采用了MapReduce的策略算法,并且同时向HBase写入,如图所示:
5)在Hbase中插入数据,Hive中查看
在hbase在运行put命令,插入一条记录:
put'xyz','10001','cf1:val','www.javabloger.com'
在hive上运行查询语句,看看刚刚在hbase中插入的数据有没有同步过来,
select * from hbase_table_1 WHERE key=10001;
如图:
Hbase中:
Hive中:
6)多列和多列族的情况:
Hive建表:
CREATE TABLE hbase_table_2(key int, value1string, value2 int, value3 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b,a:c,d:e"
);
插入数据:
INSERT OVERWRITE TABLE hbase_table_2 SELECTfoo, bar, foo+1, foo+2
FROM pokes WHERE foo=98 OR foo=100;
说明:
这个有3个hive的列(value1和value2,value3),2个hbase的列族(a,d)
Hive的2列(value1和value2)对应1个hbase的列族(a,在hbase的列名称b,c),hive的另外1列(value3)对应列(e)位于列族(d)
4、参考文献
[1] http://simpleframework.net/blog/v/13164.html
[2] http://www.open-open.com/lib/view/open1328413245124.html
本文详细介绍了如何将Hive与HBase整合,包括整合原理、步骤和实际运用。在整合过程中,需要Hadoop、Hive、Hbase、Zookeeper等软件,并涉及Hive的配置修改、jar包的拷贝以及HBase表的映射设置。通过整合,可以在Hive中直接操作HBase的数据。

9528

被折叠的 条评论
为什么被折叠?



