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大資料探勘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買博主的書進行學習,在此感謝大家的支援。關注下面公眾號,根據提示,可免費獲取書籍的教學視