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大數據與數據倉庫,領取資料,學習大數據技術。