Hive On HBase實戰


1.概述

HBase是一款非關系型、分布式的KV存儲數據庫。用來存儲海量的數據,用於鍵值對操作。目前HBase是原生是不包含SQL操作,雖然說Apache Phoenix可以用來操作HBase表,但是需要集成對應的Phoenix依賴包到HBase集群中,同時需要編寫對應的Schema才能實現SQL操作HBase。

本篇博客,筆者將為大家介紹另一位一種SQL方式來操作HBase,那就是Hive。

2.內容

2.1 使用場景

熟悉大數據的同學應該都知道,Hive是一個分布式的數據倉庫,它能夠將海量數據,結構化存儲到HDFS上,然后通過SQL的方式對這些海量數據進行業務處理。而且,Hive學習成本很低,熟悉SQL的同學,很快就能編寫一個Hive應用程序。

我們通過Hive把數據加載到HBase表中時,數據源可以是文件,也可以是表。當HBase集群集成Hive后,如果對Hive表追加數據的同時,HBase表中的數據也會增加。在原生的HBase集群中,HBase表不支持連接查詢或是分組查詢等,但是我們可以通過Hive On HBase的方式來讓HBase集群支持這些功能。比如,事先將數據加載到Hive表中,然后通過Hive SQL的JOIN、GROUP BY等語法來操作。

2.2 基礎環境

實戰的基礎環境信息如下所示:

組件 版本
Hadoop 2.7.4
Hive 3.1.2
HBase 1.2.0
JDK 1.8

2.3 Hive On HBase表

Hive字段和HBase中的列都是通過Storage Handler來維護的。創建Hive表時,把存儲格式指定為Storage Handler,這個程序被編譯成一個獨立的模塊,在Java中它就是一個獨立的Jar包,比如hive-hbase-handler-{version}.jar,Hive的客戶端必須要能夠識別到這個JAR,可以通過--auxpath來指定,操作命令如下:

hive --auxpath hive-hbase-handler-{version}.jar --hiveconf hbase.master=hbasemaster:60000

接着將HBase安裝目錄lib下的包復制到Hive安裝目錄lib中,操作命令如下:

cp -r $HBASE_HOME/lib/* $HIVE_HOME/lib

最后,執行hive命令啟動Hive客戶端窗口。

在Hive集成HBase時,可以有效的利用HBase的存儲個性,比如更新和索引等。Hive表需要與HBase之間建立映射關系,創建Hive表名如下:

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

然后,執行hbase shell來查看創建的HBase表,命令如下:

hbase(main):001:0> list
xyz                                                                                                           
1 row(s) in 0.0530 seconds
hbase(main):002:0> describe 'xyz'
DESCRIPTION                                                             ENABLED                               
 {NAME => 'xyz', FAMILIES => [{NAME => 'cf1', COMPRESSION => 'NONE', VE true                                  
 RSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY =>                                       
  'false', BLOCKCACHE => 'true'}]}                                                                            
1 row(s) in 0.0220 seconds
hbase(main):003:0> scan 'xyz'
ROW                          COLUMN+CELL

2.4 加載數據源到Hive表

然后,將HDFS上的文本文件加載到一個臨時的Hive表中,操作命令如下所示:

hive -e "load data local inpath '/hbase/hive/data/testdata.txt' overwrite into table hive_on_hbase_test;"

接着,把hive_on_hbase_test表中的數據加載到hbase_table_1表中,操作命令如下:

insert overwrite table hbase_table_1 select * from hive_on_hbase_test;

2.4.1 查詢Hive表

查詢hbase_table_1表是否有數據,查詢語句如下:

hive> select * from hbase_table_1;
Total MapReduce jobs = 1
Launching Job 1 out of 1
...
OK
100    val_100
Time taken: 3.582 seconds

正常情況下,顯示結果會與testdata.txt文件中的數據是一致的。

2.4.2 查詢HBase表

當hbase_table_1表正常加載數據后,我們可以使用HBase的Scan命令來查看數據,具體操作命令如下:

hbase(main):001:0> scan 'xyz',LIMIT=>1
ROW                       COLUMN+CELL                                                                      
100                       column=cf1:val, timestamp=1572154138015, value=val_100                            
1 row(s) in 0.0110 seconds

這里防止數據顯示過多,我們設置一下限制條件。

由於WAL開銷,插入大量數據可能會很慢;如果要禁用此功能,可以執行如下命令:

set hive.hbase.wal.enabled=false;

這里需要注意的是,如果HBase發生故障,禁用WAL可能會導致數據丟失,因此只有在有其他可用的恢復策略時才建議使用此選項。

2.4.3 外部表

如果需要使用Hive訪問已存在的HBase表時,可以使用Hive外部表,操作命令如下:

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

然后,在Hive客戶端中查詢外部表的數據,操作命令如下:

select * from hbase_table_2;

3.總結

Hive On HBase集成比較簡單,實現難度不算太大。如果有離線場景(延時要求不高),或者需要使用SQL來做JOIN、GROUP BY等操作的業務場景,可以嘗試用Hive On HBase的方式來實現。

4.結束語

這篇博客就和大家分享到這里,如果大家在研究學習的過程當中有什么問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉!

另外,博主出書了《Kafka並不難學》和《Hadoop大數據挖掘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那里點擊購買鏈接購買博主的書進行學習,在此感謝大家的支持。關注下面公眾號,根據提示,可免費獲取書籍的教學視頻。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM