Hive如何加載和導入HBase的數據


當我們用HBase 存儲實時數據的時候, 如果要做一些數據分析方面的操作, 就比較困難了, 要寫MapReduce Job。 Hive 主要是用來做數據分析的數據倉庫,支持標准SQL 查詢, 做數據分析很是方便,於是便很自然地想到用Hive來載入HBase的數據做分析, 但是很奇怪地是, 上網查了一下, 只看到以下兩種情況:

1. 如何用Hive 往HBase里面插入大量的數據。

2. Hive 與HBase集成, 直接從Hive里面連HBase的數據庫進行查詢。參考鏈接: https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

選項1是我們需求的逆操作, 直接忽略, 選項2,  雖然沒有做專門的Benchmark, 但總感覺直接對HBase進行查詢操作不怎么靠譜, 如果我們要頻繁做很多類型的數據分析, 那HBase的壓力一定會倍增。

難道沒有把HBase里面的數據直接導入到Hive當中的工具或者方法嗎?

找了一會, 似乎沒找到, 那么只好自己想一個解決方案了。

思路:

利用選項2,  先打通Hive對HBase指定表的全表訪問, 再建立一個新的空表, 把查詢出來的數據全部導入到新表當中, 以后的所有數據分析操作在新表中完成。

說干就干, 讓我們試一個簡單的例子。

首先在HBase里面建一個表, 名為 student, 包含 id 和 name 兩個column.

hbase shell

create 'student', 'id', 'name'

向表中插入兩行數據

put 'student', 'row1', 'id:val', '1'
put 'student', 'row1', 'name:val', 'Tony'
put 'student', 'row2', 'id:val', '2'
put 'student', 'row2', 'name:val', 'Mike'

注意:在插入數據的時候一定要指定column (如id:val, name:val) 直接使用column family (如 id, name) 去存數據會導致后面Hive 建表的時候有問題。

掃描此表, 確定數據已經插入

scan 'student'
ROW                               COLUMN+CELL                                                                                     
 row1                             column=id:val, timestamp=1384939342989, value=1                                                 
 row1                             column=name:val, timestamp=1384939365511, value=Tony                                            
 row2                             column=id:val, timestamp=1384939351444, value=2                                                 
 row2                             column=name:val, timestamp=1384939379245, value=Mike                                            

 

建立Hive 對HBase的訪問

參考: https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

這里我們使用的是Pivotal 公司的Pivotal Hadoop, 

hive --auxpath /usr/lib/gphd/hive/lib/hive-hbase-handler-0.11.0-gphd-2.1.1.0.jar,/usr/lib/gphd/hbase/hbase.jar,/usr/lib/gphd/zookeeper/zookeeper.jar,/usr/lib/gphd/hbase/lib/guava-11.0.2.jar -hiveconf hbase.zookeeper.quorum=centos62-3,centos62-4,centos62-5

解釋一下參數:

后面三個jar 包主要是Hive 訪問時需要用到的, hhbase.zookeeper.quorum=centos62-3,centos62-4,centos62-5 是指hbase使用的是這三個zookeeper, 這樣就不用指定hbase master了。

這個命令運行完以后會打開Hive 的輸入終端。

從Hive建立可以訪問HBase的外部表

CREATE EXTERNAL TABLE student(key string, id int, name string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "id:val,name:val")
TBLPROPERTIES("hbase.table.name" = "student");

掃描student表, 確認訪問成功:

hive> select * from student;
OK
row1    1    Tony
row2    2    Mike

但是此時這個表實際上是一個虛擬表, 實際的數據還在HBase中。 下面需要在Hive中另建一個結構一樣的空表, 再把數據導出來。

Hive中建立一個新的空表

CREATE TABLE new_student (
  key string,
  id INT,
  name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

將數據從HBase中導入到新的Hive表中

hive> INSERT OVERWRITE TABLE new_student SELECT * FROM student;

確認新表中數據正確:

hive> select * from new_student;
OK
row1    1    Tony
row2    2    Mike

至此大功告成!

以后所有復雜的數據查詢和數據分析都可以在new_student表中完成。

 

版權聲明:

本文由 雷子-曉飛爸 所有,發布於http://www.cnblogs.com/npumenglei/ 如果轉載,請注明出處,在未經作者同意下將本文用於商業用途,將追究其法律責任。

 

 


免責聲明!

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



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