Hive整合Hbase

HBase 雖然可以存儲數億或數十億行數據,但是對於數據分析來說,不太友好,只提供了簡單的基於 Key 值的快速查詢能力,沒法進行大量的條件查詢。現有hbase的查詢工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要說Hive,Hive方便地提供了Hive QL的介面來簡化MapReduce的使用, 而HBase提供了低延遲的資料庫訪問。如果兩者結合,可以利用MapReduce的優勢針對HBase存儲的大量內容進行離線的計算和分析。

Hive和HBase的通訊原理

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()來獲取數據;

基本通訊原理如下:

hive-hbase

具體步驟

新建hbase表:

create 'test', 'f1'

插入數據:

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,有兩個列c1c2,新建hive表關聯hbase的這兩列:

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中的每一個列族。

其中,參數解釋如下:

  • hbase.zookeeper.quorum:

指定HBase使用的zookeeper集群,默認埠是2181,可以不指定,如果指定,格式為zkNode1:2222,zkNode2:2222,zkNode3:2222

  • zookeeper.znode.parent

指定HBase在zookeeper中使用的根目錄

  • hbase.columns.mapping

Hive表和HBase表的欄位一一映射,分別為:Hive表中第一個欄位映射:key(rowkey),第二個欄位映射列族f1:c1,第三個欄位映射列族發:f1:c2。

  • hbase.table.name

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

Spark讀取提升速度

hive關聯hbase實際是底層是MR,速度較慢,此時可以使用spark讀取hive表,進行查詢操作,從而訪問hbase數據。

關注公眾號:Java大數據與數據倉庫,領取資料,學習大數據技術。

Tags: