hbase与hive整合

本文详细介绍了如何将Hive与HBase整合,包括整合原理、步骤和实际运用。在整合过程中,需要Hadoop、Hive、Hbase、Zookeeper等软件,并涉及Hive的配置修改、jar包的拷贝以及HBase表的映射设置。通过整合,可以在Hive中直接操作HBase的数据。
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值