hive与hbase整合

Hive整合HBase原理

Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-*.jar工具类来实现,通信原理如下图所示。

hive与hbase整合

Hive整合HBase后的使用场景:

(一)通过Hive把数据加载到HBase中,数据源可以是文件也可以是Hive中的表。

(二)通过整合,让HBase支持JOIN、GROUP等SQL查询语法。

(三)通过整合,不仅可完成HBase的数据实时查询,也可以使用Hive查询HBase中的数据完成复杂的数据分析。

 Hive整合HBase配置

 1 Hive映射HBase表

// 如果hbase是集群,需要修改hive-site.xml文件配置

$ vim hive-site.xml

[html] view plain copy
  1. <property>  
  2.   <name>hbase.zookeeper.quorum</name>  
  3.   <value>node1,node2,node3</value>  
  4. </property>  

// 将hbase lib目录下的所有文件复制到hive lib目录中

$ cd app/hive-1.1.0-cdh5.7.1/

$ cp ~/app/hbase-1.2.0-cdh5.7.1/lib/* lib/

// 在hive中创建映射表

$ hive shell

> create table hive_hbase_test(key int,value string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,cf1:val") tblproperties("hbase.table.name"="hive_hbase_test");

备注:在hive中创建表hive_hbase_test,这个表包括两个字段(int型的key和string型的value),映射为hbase中的表hive_hbase_test,key对应hbase的rowkey,value对应hbase的cf1:val列。

hive与hbase整合

// 在hbase中查看是否存在映射表

$ hbase shell

> list

hive与hbase整合

2 整合后功能测试

// 创建测试数据

$ vim poke.txt

1      zhangsan

2      lisi

3      wangwu

hive与hbase整合

// 在hive中创建一个poke表并加载测试数据

> create table poke(key int,valuestring) row format delimited fields terminated by '\t';

> load data local inpath '/home/developer/poke.txt' overwrite into table poke;

> select * from poke;

hive与hbase整合

// 将hive的poke表中的数据加载到hive_hbase_test表

> insert overwrite table hive_hbase_test select * from poke;

> select * from hive_hbase_test;

hive与hbase整合

// 查看hbase的hive_hbase_test表中是否有同样的数据

> scan 'hive_hbase_test'

hive与hbase整合

需要说明以下几点:

(一)Hive映射表的字段是HBase表字段的子集。整合之后的Hive表不能被修改。

(二)Hive中的映射表不能直接插入数据,所以需要通过将数据加载到另一张poke表,然后通过查询poke表将数据加载到映射表。

(三)上述示例是通过创建内部表的方式将Hive表映射到HBase表,HBase表会自动创建,而且Hive表被删除后HBase表也会自动删除。

(四)如果HBase表已有数据,可以通过创建Hive外部表的方式将Hive表映射到HBase表,通过HQLHive表实现对HBase表的数据分析。Hive表删除将不会对HBase表造成影响。创建外部表的方法如下:

> create external table hive_hbase_test(key int,value string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,cf1:val") tblproperties("hbase.table.name"="hive_hbase_test");