HBase 虽然能够存储数亿或数十亿行数据,可是对于数据分析来讲,不太友好,只提供了简单的基于 Key 值的快速查询能力,无法进行大量的条件查询。现有hbase的查询工具备不少如:Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要说Hive,Hive方便地提供了Hive QL的接口来简化MapReduce的使用, 而HBase提供了低延迟的数据库访问。若是二者结合,能够利用MapReduce的优点针对HBase存储的大量内容进行离线的计算和分析。node
Hive与HBase整合的实现是利用二者自己对外的API接口互相通讯来完成的,这种相互通讯是经过$HIVE_HOME/lib/hive-hbase-handler-{hive.version}.jar
工具类实现的。经过HBaseStorageHandler,Hive能够获取到Hive表所对应的HBase表名,列簇和列,InputFormat、OutputFormat类,建立和删除HBase表等。Hive访问HBase中表数据,实质上是经过MapReduce读取HBase表数据,其实现是在MR中,使用HiveHBaseTableInputFormat完成对HBase表的切分,获取RecordReader对象来读取数据。对HBase表的切分原则是一个Region切分红一个Split,即表中有多少个Regions,MR中就有多少个Map;读取HBase表数据都是经过构建Scanner,对表进行全表扫描,若是有过滤条件,则转化为Filter。当过滤条件为rowkey时,则转化为对rowkey的过滤;Scanner经过RPC调用RegionServer的next()来获取数据;sql
基本通讯原理以下:shell
新建hbase表:数据库
create 'test', 'f1'
插入数据:apache
put 'test','1','f1:c1','name1' put 'test','1','f1:c2','name2' put 'test','2','f1:c1','name1' put 'test','2','f1:c2','name2' put 'test','3','f1:c1','name1' put 'test','3','f1:c2','name2'
这里hbase有个列簇f1
,有两个列c1
和c2
,新建hive表关联hbase的这两列:app
SET hbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3; SET zookeeper.znode.parent=/hbase; ADD jar hive-hbase-handler-{hive.version}.jar; CREATE EXTERNAL TABLE test.test ( rowkey string, c1 string, c2 string ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:c1,f1:c2") TBLPROPERTIES ("hbase.table.name" = "test");
这里使用外部表映射到HBase中的表,hive对应的hdfs目录是空的,数据仍然在hbase中,这样在Hive中删除表,并不会删除HBase中的表,不然,就会删除。工具
另外,除了rowkey,其余三个字段使用Map结构来保存HBase中的每个列族。oop
其中,参数解释以下:学习
指定HBase使用的zookeeper集群,默认端口是2181,能够不指定,若是指定,格式为zkNode1:2222,zkNode2:2222,zkNode3:2222大数据
指定HBase在zookeeper中使用的根目录
Hive表和HBase表的字段一一映射,分别为:Hive表中第一个字段映射:key(rowkey),第二个字段映射列族f1:c1,第三个字段映射列族发:f1:c2。
HBase中表的名字
也能够直接在Hive中建立表的同时,完成在HBase中建立表。
在hive中查询hbase表:
hive> select * from test.test; OK 1 name1 name2 2 name1 name2 3 name1 name2
也能够插入数据:
insert into test.test select '4', 'name4', 'name4';
查看hbase的数据:
hive> select * from test.test; OK 1 name1 name2 2 name1 name2 3 name1 name2 4 name4 name4
hive关联hbase实际是底层是MR,速度较慢,此时可使用spark读取hive表,进行查询操做,从而访问hbase数据。
关注公众号:Java大数据与数据仓库,领取资料,学习大数据技术。