1. 程式人生 > 其它 >[喵咪大資料]Hive+Hbase關聯

[喵咪大資料]Hive+Hbase關聯

在之前的章節中我們已經一同學習的Hive和HBase相關的知識,但是Hive和HBase都存在各自的問題,Hive實時性不強單條寫入資料慢,HBase查詢能力差不具備複雜查詢的能力,但是Hive和HBase有個隱藏的功能就是關聯操作,既然可以享受到HBase的實時性還可以享受到Hive查詢帶來的便捷.

附上:

喵了個咪的部落格:w-blog.cn

1.前言

**注意:**Hive2.3.0 和 Hbase 關聯表 使用 select count(*) form 表名 只會返回0條不會走 MR 程式 可以通過count(欄位) 來查詢會查詢到具體數字 Hive2.1.1版本無此問題

Hive提供了與HBase的整合,使得能夠在HBase表上使用HQL語句進行查詢 插入操作以及進行Join和Union等複雜查詢,一方面可以通過Hive來補充Hbase在結構查詢場景的不足,一方面Hbase可以作為Hive的一個數據源

優點:

Hive方便地提供了Hive QL的介面來簡化MapReduce的使用, 而HBase提供了低延遲的資料庫訪問。如果兩者結合,可以利 用MapReduce的優勢針對HBase儲存的大量內容進行離線的計算和分析。 操作方便,hive提供了大量系統功能

缺點:

效能的損失,hive有這樣的功能, 他支援通過類似sql語句的語法來操作hbase中的資料, 但是速度慢。

2.準備環境

要結合使用hbase在hive所在的節點上必須要配置hbase 大家發現在執行HIVE命令的時候會出現,缺少hbase 可以看到hive預設就已經開始支援hbase了

which: no hbase in (/usr/local/ant/bin:/usr/local/hadoop-2.7.3/bin:/usr/local/hive-2.1.1/bin:/usr/local/jdk1.8/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

我們首先需要把hbase 從hadoop-1 cp 到hive機器上

> scp -r /usr/local/hbase-1.3.1/ [email protected]:/usr/local/hbase-1.3.1/

修改環境配置檔案

> vim /etc/profile
# hbase
export HBASE_HOME=/usr/local/hbase-1.3.1
export PATH=$HBASE_HOME/bin:$PATH
> source /etc/profile

配置好之後在執行hive就不會有上面的which提示了

3.關聯

建立一個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" = "hbase_table_1");

其中:

  • hbase.table.name 定義在hbase的table名稱
  • hbase.columns.mapping 定義在hbase的列族

hbase裡自動建好hbase_table_1這個表然後在Hive和Hbase查看錶

hive> SHOW TABLES;
OK
hbase_table_1
Time taken: 0.014 seconds, Fetched: 1 row(s)
hbase(main):004:0> list
TABLE                                                                                                                       
hbase_table_1                                                                                                               
member                                                                                                                      
member2                                                                                                                     
3 row(s) in 0.0040 seconds

可以在Hbase中檢視一下表的描述

hbase(main):005:0> describe 'hbase_table_1'
Table hbase_table_1 is ENABLED                                                                                              
hbase_table_1                                                                                                               
COLUMN FAMILIES DESCRIPTION                                                                                                 
{NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCOD
ING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REP
LICATION_SCOPE => '0'}                                                                                                      
1 row(s) in 0.0900 seconds

使用 Hbase插入幾條資料

put 'hbase_table_1','100','cf1:val','www.gongchang.com';

也可以通過Hive中寫入資料然後對映到Hbase中(明顯在Hive中插入資料會指向MR效率太慢了)

INSERT INTO TABLE hbase_table_1 values("101","www.baidu.com");

檢視資料

hbase(main):021:0> scan 'hbase_table_1'
ROW                              COLUMN+CELL                                                                                
 100                             column=cf1:val, timestamp=1501654042302, value=www.gongchang.com                           
 101                             column=cf1:val, timestamp=1501654548848, value=www.baidu.com                               
2 row(s) in 0.0130 seconds
hive> select * from hbase_table_1;
OK
100     www.gongchang.com
101     www.baidu.com
Time taken: 0.16 seconds, Fetched: 2 row(s)

這樣建立出來的表插入的源資料都是在Hbase裡面存放著,當從Hbase中刪除記錄的同時也會刪除在Hive中的資料

資料可以匯入到Hive中另外一個表中獨立於Hbase資料

CREATE TABLE hbase_table_2(key int, value string);
insert overwrite TABLE hbase_table_1 select * from hbase_table_1 where key = '100';

上面這種方式是內連表刪除Hive中的表同時也會影響到Hbase中的資料

上面是在建立Hive的表的時候一同建立了Hbase的表一般的情況Hbase的資料可能先存在要怎麼關聯到Hive中(這類是外連結串列刪除Hive中的表不影響Hbase中的資料)

準備Hbase資料

hbase(main):009:0> create 'student','info'
0 row(s) in 1.7530 seconds  
put "student",'1','info:name','tom'
put "student",'2','info:name','lily'
put "student",'3','info:name','wwn'

hbase(main):032:0> scan 'student'
ROW                              COLUMN+CELL                                                                                
 1                               column=info:name, timestamp=1501655363517, value=tom                                       
 2                               column=info:name, timestamp=1501655363526, value=lily                                      
 3                               column=info:name, timestamp=1501655363534, value=wwn                                       
3 row(s) in 0.0080 seconds

建立Hive中的關聯表

CREATE EXTERNAL TABLE hbase_table_3(key int, value string)      
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'    
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")     
TBLPROPERTIES("hbase.table.name" = "student");
  
hive> select * from hbase_table_3;
OK
1       tom
2       lily
3       wwn
Time taken: 0.109 seconds, Fetched: 3 row(s)

4. 多列和多列族

CREATE TABLE hbase_table_add1(key int, value1 string, value2 int, value3 int)      
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'    
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:col1,info:col2,city:nu")  
TBLPROPERTIES("hbase.table.name" = "student_info");   
通過引數hive.cli.print.header可以控制在cli中是否顯示錶的列名。
hive> set hive.cli.print.header=true;  
hive> select * from hbase_table_3;  
OK
hbase_table_3.key       hbase_table_3.value
1       tom
2       lily
3       wwn
Time taken: 0.113 seconds, Fetched: 3 row(s)
insert overwrite table hbase_table_add1 select key,value,key+1,key+100 from hbase_table_3;  
hive> select * from hbase_table_add1;
OK
hbase_table_add1.key    hbase_table_add1.value1 hbase_table_add1.value2 hbase_table_add1.value3
1       tom     2       101
2       lily    3       102
3       wwn     4       103
Time taken: 0.097 seconds, Fetched: 3 row(s)
hbase(main):037:0> list
TABLE                                                                                                                       
hbase_table_1                                                                                                               
member                                                                                                                      
member2                                                                                                                     
student                                                                                                                     
student_info                                                                                                                
5 row(s) in 0.0050 seconds

=> ["hbase_table_1", "member", "member2", "student", "student_info"]
hbase(main):038:0> scan 'student_info'
ROW                              COLUMN+CELL                                                                                
 1                               column=city:nu, timestamp=1501656221390, value=101                                         
 1                               column=info:col1, timestamp=1501656221390, value=tom                                       
 1                               column=info:col2, timestamp=1501656221390, value=2                                         
 2                               column=city:nu, timestamp=1501656221390, value=102                                         
 2                               column=info:col1, timestamp=1501656221390, value=lily                                      
 2                               column=info:col2, timestamp=1501656221390, value=3                                         
 3                               column=city:nu, timestamp=1501656221390, value=103                                         
 3                               column=info:col1, timestamp=1501656221390, value=wwn                                       
 3                               column=info:col2, timestamp=1501656221390, value=4                                         
3 row(s) in 0.0120 seconds

這裡有3個hive的列,(value1和value2,value3),2個hbase的列簇(info,city) hive的2列(value,和value2)對應1個hbase的列簇(info,在hbase的列名稱col1,col2), hive的另外1列(value3)對應列nu位於city列簇。

這裡實現了hive中表,多列存放到hbase少量固定的列簇中。

5 總結

Hive和HBase相結合有更高的靈活性,無論是對HBase資料統計查詢還是對Hive擴充套件資料來源都有很好的使用場景,下節將給大家介紹一個厲害的大資料管理工具HUE,最後謝謝大家的支援我們下節再見!

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!