Hive和hbase整合依赖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数据
4.2 hbase数据
5.数据操作
5.1hbase修改数据
对应在hive中的数据查看:
6.关闭服务操作对比
6.1关闭hbase,进行hive查询
6.2关闭hive,hbase操作
hbase(main):006:0> put 'hbase_and_hive_test1','1000','cf1:val','val_1000'
6.3重启hive,查看数据
由此可以看出,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;
|--创建内部表
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;
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数据查询
3.2hive数据插入
insert into table hbase2hive_hive_dd values(4,'lucy',18);
hbase数据查询
总结:
第一点:
Hive创建hbase的表在hbase的数据中没有版本号
第二点:数据在hdfs的存储
1.创建hive表同时创建hbase表:Hbase对应的hdfs目录中也有对应表的数据,hive对应表的目录hdfs有数据,所以这个表在hdfs中保留了2份数据。
2.创建hive表映射已有的hbase表,hbase的hdfs对应有数据,hive表对应目录为空,所以数据在hdfs只保留了一份。
第三点:数据读写
1.hive,hbase都启动:hbase修改数据,同样hive表中的数据一致性正常。相比较hive的insert写入一条数据,hbase的put要高效很多。同理hbase使用get 一条数据要比hive查询一条数据要快。
2.hive启动,hbase关闭,通过hive操作查询表报Error。
3.hive关闭,hbase启动,通过hbase操作查询,添加正常,然后重新启动hive,数据一致性正常。