hive和hbase整合

浏览: 3756

Hivehbase整合依赖hive-hbase-handler.jar,存在与hive的lib下面, 应用目前只找到了两种操作:

        第一种:hive创建表同时创建hbase

        第二种:hive映射已经有的hbase


第一部分:hive创建表同时创建hbase

1.hive创建hbase的表

CREATE TABLE hive2hbase_test1(key int, value string)  
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "hbase_and_hive_test1");

2.hbase查看表hbase_and_hive_test1

hbase(main):001:0> list
...
hbase_and_hive_test1
...
11 row(s) in 19.7930 seconds
hbase(main):004:0> describe 'hbase_and_hive_test1'
DESCRIPTION ENABLED
'hbase_and_hive_test1', {NAME => 'cf1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS = true
> '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMO
RY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.3840 seconds

3.hive加载测试数据

LOAD DATA LOCAL INPATH '/root/kv1.txt' OVERWRITE INTO TABLE hive2hbase_test1;
SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD //报异常,load只支持原生的hive表

|--采用中间表的形式
insert into table hive2hbase_test1 select * from hive_hbase_data
select * from hive2hbase_test1

4.数据查看

    4.1hive数据

QQ图片20160422112322.png

    4.2 hbase数据

QQ图片20160422112457.png

5.数据操作

    5.1hbase修改数据

QQ图片20160422112758.png

对应在hive中的数据查看:

QQ图片20160422120503.png

6.关闭服务操作对比

    6.1关闭hbase,进行hive查询

QQ图片20160422120646.png

     6.2关闭hive,hbase操作

QQ图片20160422120807.png

hbase(main):006:0> put 'hbase_and_hive_test1','1000','cf1:val','val_1000'

QQ图片20160422120853.png

    6.3重启hive,查看数据

QQ图片20160422121021.png

由此可以看出,hive和hbase的整合,其实重点还是hbase对数据操作。


第二部分:先创建hbase表然后hive映射

1.创建表并添加数据

hbase(main):009:0> create 'hbase2hive_test1','info'
0 row(s) in 9.5580 seconds
=> Hbase::Table - hbase2hive_test1
hbase(main):010:0> describe 'hbase2hive_test1'
DESCRIPTION ENABLED
'hbase2hive_test1', {NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => ' true
1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY
=> 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.0710 seconds
hbase(main):011:0>

base(main):011:0> put 'hbase2hive_test1','1','info:name','kevin'
0 row(s) in 1.9080 seconds
hbase(main):013:0> put 'hbase2hive_test1','1','info:age','24'
0 row(s) in 0.0360 seconds
hbase(main):015:0> put 'hbase2hive_test1','2','info:age','20'
0 row(s) in 0.0310 seconds
hbase(main):016:0> put 'hbase2hive_test1','2','info:name','lily'
0 row(s) in 0.0960 seconds
hbase(main):017:0> scan 'hbase2hive_test1'
ROW COLUMN+CELL
1 column=info:age, timestamp=1439804776880, value=24
1 column=info:name, timestamp=1439804748955, value=kevin
2 column=info:age, timestamp=1439804801720, value=20
2 column=info:name, timestamp=1439804819499, value=lily
2 row(s) in 0.0810 seconds

2.创建hive表进行hbase表映射

|--创建外部表
CREATE EXTERNAL TABLE hbase2hive_hive(id int, name string,age int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,info:name,info:age" //key表示hbase的ROW
)
TBLPROPERTIES("hbase.table.name" = "hbase2hive_test1")
;


select * from hbase2hive_hive;

QQ图片20160422121332.png

|--创建内部表
CREATE EXTERNAL TABLE hbase2hive_hive_dd(id int, name string,age int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:age")
TBLPROPERTIES("hbase.table.name" = "hbase2hive_test1")
;

select * from hbase2hive_hive_dd;

QQ图片20160422121513.png

3.数据验证

    3.1hbase数据插入

hbase(main):018:0> put 'hbase2hive_test1','3','info:name','jhon'
0 row(s) in 0.3260 seconds
hbase(main):019:0> put 'hbase2hive_test1','3','info:age','28'
0 row(s) in 0.0710 seconds
hbase(main):020:0>

hive数据查询

QQ图片20160422121649.png

    3.2hive数据插入

insert into table hbase2hive_hive_dd values(4,'lucy',18);

hbase数据查询

QQ图片20160422121824.png

总结:

第一点:

      Hive创建hbase的表在hbase的数据中没有版本号

第二点:数据在hdfs的存储

      1.创建hive表同时创建hbase表:Hbase对应的hdfs目录中也有对应表的数据,hive对应表的目录hdfs有数据,所以这个表在hdfs中保留了2份数据。

      2.创建hive表映射已有的hbase表,hbasehdfs对应有数据,hive表对应目录为空,所以数据在hdfs只保留了一份。

第三点:数据读写

      1.hive,hbase都启动:hbase修改数据,同样hive表中的数据一致性正常。相比较hive的insert写入一条数据,hbase的put要高效很多。同理hbase使用get 一条数据要比hive查询一条数据要快。

      2.hive启动,hbase关闭,通过hive操作查询表报Error

      3.hive关闭,hbase启动,通过hbase操作查询,添加正常,然后重新启动hive,数据一致性正常。

推荐 4
本文由 平常心 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

高大上
HIVE为什么不直接在HDFS上呢?在HBASE上和在HDFS上,有什么区别?
因为业务关系,hive数据量大查询有优势,而对于数据量小的表查询hbase高效;另外对数据update,或者insert单条记录操作hbase适合,同时hbase可以整合phoenix做sql查询。无论hive还是hbase,数据总是存储在hdfs上的。

要回复文章请先登录注册