分享

Hive整合HBase——通过Hive读/写 HBase中的表

问题导读
1、Hive整合HBase原理的实现机制是什么?
2、导入数据的流程有哪些呢?
3、如何分别查看Hive、HBase中的数据?






写在前面一:
本文将Hive与HBase整合在一起,使Hive可以读取HBase中的数据,让Hadoop生态系统中最为常用的两大框架互相结合,相得益彰。
1.jpg



写在前面二:
使用软件说明
2.jpg


约定所有软件的存放目录:
/home/yujianxin


一、Hive整合HBase原理
Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-0.9.0.jar工具类,如下图
1.jpg


Hive与HBase通信示意图
2.jpg




二、具体步骤
安装前说明
1、关于Hadoop、HBase、Hive集群的搭建,请参考“基于Hadoop的数据分析综合管理平台之Hadoop、HBase完全分布式集群搭建”
2、本文中Hadoop、HBase、Hive安装路径
1.jpg


2.1、拷贝jar包
删除$HIVE_HOME/lib/下HBase、Zookeeper相关jar
  1. rm -rf $HIVE_HOME/lib/zookeeper-*.jar  
  2. rm -rf $HIVE_HOME/lib/hbase*.jar  
复制代码


重新拷贝
  1. cp $HBASE_HOME/hbase-0.94.7-security.jar $HIVE_HOME/lib/   
  2. cp $HBASE_HOME/lib/zookeeper-3.4.5.jar $HIVE_HOME/lib/  
复制代码



2.2、修改$HIVE_HOME/conf/hive-site.xml
mkdir $HIVE_HOME/logs
在尾部添加
  1. <property>  
  2. <name>hive.querylog.location</name>  
  3. <value>/home/yujianxin/hive/hive-0.9.0/logs</value>  
  4. </property>  
  5. <property>  
  6. <name>hive.aux.jars.path</name>  
  7. <value>  
  8. file:///home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,  
  9. file:///home/yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,  
  10. file:///home/yujianxin/hive/hive-0.9.0/lib/zookeeper-3.4.5.jar   
  11. </value>  
  12. </property>  
复制代码



修改
  1. <property>  
  2.   <name>hive.zookeeper.quorum</name>  
  3.   <value>master,slave1,slave2</value>  
  4. </property>  
复制代码


2.3、拷贝hbase-0.94.7-security.jar到所有hadoop节点(包括master)的hadoop/lib下
  1. cp $HBASE_HOME/hbase-0.94.7-security.jar $HADOOP_HOME/lib
复制代码


2.4、拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点(包括master)的hadoop/conf下
  1. cp $HBASE_HOME/conf/hbase-site.xml  $HADOOP_HOME/conf  
复制代码



三、启动、使用配置后Hive,测试是否配置成功
3.1、启动Hive
集群方式启动
  1. hive --auxpath /home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,/home/  
  2. yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,/home/yujianxin/hive/hive-0.9.  
  3. 0/lib/zookeeper-3.4.5.jar
复制代码

可以将此启动Hive与HBase整合的命令写成Shell脚本,设置成开机启动
1.jpg


3.2、在Hive中创建HBase识别的表
  1. CREATE TABLE hbase_hive_1(key int, value string)   
  2. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   
  3. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")   
  4. TBLPROPERTIES ("hbase.table.name" = "xyz");  
复制代码


hbase.table.name 定义在hbase中的table名称
多列时,data:1,data:2
多列族时,data1:1,data2:1
hbase.columns.mapping 定义在hbase的列族,里面的:key 是固定值而且要保证在表pokes中的foo字段是唯一值

创建有分区的表

  1. CREATE TABLE hbase_hive_2(key int, value string)   
  2. partitioned by (day string)   
  3. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   
  4. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")   
  5. TBLPROPERTIES ("hbase.table.name" = "xyz2");  
复制代码



分别查看Hive、HBase中建立的表
1.jpg




3.3、导入数据
新建hive的数据表
  1. create table pokes(foo int,bar string)
  2. row format delimited fields terminated by ',';
复制代码


批量导入数据
1.jpg


  1. load data local inpath '/home/yujianxin/temp/data1.txt' overwrite into table pokes;
复制代码


使用sql导入hbase_table_1
  1. SET hive.hbase.bulk=true;
  2. insert overwrite table hbase_hive_1 select * from pokes;
复制代码


导入有分区的表
  1. insert overwrite table hbase_hive_2  partition (day='2012-01-01') select * from pokes;
复制代码

往Hive中插入数据同时会插入到HBase中

3.4、分别查看Hive、HBase中的数据
1.jpg



OK,到此Hive、HBase整合成功。

——————————————————————————————————————————————————————————————————

下面再给出较复杂的测试例子
情况一、对于在hbase已经存在的表,在hive中使用CREATE EXTERNAL TABLE来建立联系
1.jpg


  1. create external table hive_test (key int,gid map<string,string>,sid map<string,string>,uid map<string,string>)   
  2. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   
  3. WITH SERDEPROPERTIES ("hbase.columns.mapping" ="a:,b:,c:")   
  4. TBLPROPERTIES  ("hbase.table.name" = "test1");
复制代码

1.jpg


查询gid字段中value值
1.jpg



Hive成功读取到HBase中的数据
情况二、如果hbase表test2中的字段为user:gid,user:sid,info:uid,info:level
1.jpg


在hive中建表语句为
  1. CREATE EXTERNAL TABLE hive_test_2(key int,user map<string,string>,info map<string,string>)   
  2. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   
  3. WITH SERDEPROPERTIES ("hbase.columns.mapping" ="user:,info:")   
  4. TBLPROPERTIES  ("hbase.table.name" = "test2");
复制代码

1.jpg


Hive成功读取到HBase中的数据



已有(9)人评论

跳转到指定楼层
Victor-Shy 发表于 2014-12-19 14:31:59
本帖最后由 Victor-Shy 于 2014-12-19 14:33 编辑

我现在可以建表,但是在hive进行insert的时候就报错F:\hive-hbase.jpg这怎么插入图片,,,
回复

使用道具 举报

Victor-Shy 发表于 2014-12-22 10:29:37
楼主想问下为什么要以这种方式(hive --auxpath /home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,/home/  
yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,/home/yujianxin/hive/hive-0.9.  
0/lib/zookeeper-3.4.5.jar)启动呢???

点评

硬要说出个原因的话:程序会按照这种方式来读取后面的参数  发表于 2014-12-22 11:02
作者就是这么定义的,没有为什么,这个问题如同,你从外地到你家走了一条路,你为什么要走这条路一样。  发表于 2014-12-22 11:01
回复

使用道具 举报

Victor-Shy 发表于 2014-12-22 15:15:44
Victor-Shy 发表于 2014-12-22 10:29
楼主想问下为什么要以这种方式(hive --auxpath /home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0 ...

我的意思是既然是在hive-site中配置了这个属性,为什么启动的时候还要带着呢,应该是他会读取hive-site中的配置呀
回复

使用道具 举报

77925978 发表于 2017-7-28 09:55:23
Hive整合HBase
回复

使用道具 举报

sun_fei 发表于 2017-9-15 14:19:48
我用的CDH5.8.2  进行创建分区表的时候可以建表  插入数据的时候 报错  Must specify table name   怎么解决啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条