HBase是一款非關係型、分佈式的KV存儲數據庫。用來存儲海量的數據,用於鍵值對操做。目前HBase是原生是不包含SQL操做,雖說Apache Phoenix能夠用來操做HBase表,可是須要集成對應的Phoenix依賴包到HBase集羣中,同時須要編寫對應的Schema才能實現SQL操做HBase。html
本篇博客,筆者將爲你們介紹另外一位一種SQL方式來操做HBase,那就是Hive。shell
熟悉大數據的同窗應該都知道,Hive是一個分佈式的數據倉庫,它可以將海量數據,結構化存儲到HDFS上,而後經過SQL的方式對這些海量數據進行業務處理。並且,Hive學習成本很低,熟悉SQL的同窗,很快就能編寫一個Hive應用程序。數據庫
咱們經過Hive把數據加載到HBase表中時,數據源能夠是文件,也能夠是表。當HBase集羣集成Hive後,若是對Hive表追加數據的同時,HBase表中的數據也會增長。在原生的HBase集羣中,HBase表不支持鏈接查詢或是分組查詢等,可是咱們能夠經過Hive On HBase的方式來讓HBase集羣支持這些功能。好比,事先將數據加載到Hive表中,而後經過Hive SQL的JOIN、GROUP BY等語法來操做。apache
實戰的基礎環境信息以下所示:app
組件 | 版本 |
Hadoop | 2.7.4 |
Hive | 3.1.2 |
HBase | 1.2.0 |
JDK | 1.8 |
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中,操做命令以下:oop
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表,命令以下:spa
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
而後,將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;
查詢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文件中的數據是一致的。
當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可能會致使數據丟失,所以只有在有其餘可用的恢復策略時才建議使用此選項。
若是須要使用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;
Hive On HBase集成比較簡單,實現難度不算太大。若是有離線場景(延時要求不高),或者須要使用SQL來作JOIN、GROUP BY等操做的業務場景,能夠嘗試用Hive On HBase的方式來實現。
這篇博客就和你們分享到這裏,若是你們在研究學習的過程中有什麼問題,能夠加羣進行討論或發送郵件給我,我會盡我所能爲您解答,與君共勉!
另外,博主出書了《Kafka並不難學》和《Hadoop大數據挖掘從入門到進階實戰》,喜歡的朋友或同窗, 能夠在公告欄那裏點擊購買連接購買博主的書進行學習,在此感謝你們的支持。關注下面公衆號,根據提示,可免費獲取書籍的教學視頻。