1. 程式人生 > >Hive與Hbase關係整合

Hive與Hbase關係整合

近期工作用到了Hive與Hbase的關係整合,雖然從網上參考了很多的資料,但是大多數講的都不是很細,於是決定將這塊知識點好好總結一下供大家分享,共同掌握! 
本篇文章在具體介紹Hive與Hbase整合之前,先給大家用一個流程圖介紹Hadoop業務的開發流程以及Hive與Hbase的整合在業務當中的必要性。 
這裡寫圖片描述 
其中在資料存入hbase—>Hive對資料進行統計分析的這個步驟中就涉及到了Hive與Hbase的整合,所以瞭解Hive與Hbase的整合是很有必要的。 
1、Hive與Hbase整合的必要性 
Hive是建立在Hadoop之上的資料倉庫基礎構架、是為了減少MapReduce編寫工作的批處理系統,Hive本身不儲存和計算資料,它完全依賴於HDFS和MapReduce。Hive可以理解為一個客戶端工具,將我們的sql操作轉換為相應的MapReduce jobs,然後在Hadoop上面執行。 
Hbase全稱為Hadoop Database,即Hbase是Hadoop的資料庫,是一個分散式的儲存系統。Hbase利用Hadoop的HDFS作為其檔案儲存系統,利用Hadoop的MapReduce來處理Hbase中的海量資料。利用zookeeper作為其協調工具。 
Hbase資料庫的缺點在於—-語法格式異類,沒有類sql的查詢方式,因此在實際的業務當中操作和計算資料非常不方便,但是Hive就不一樣了,Hive支援標準的sql語法,於是我們就希望通過Hive這個客戶端工具對Hbase中的資料進行操作與查詢,進行相應的資料探勘,這就是所謂Hive與hbase整合的含義。Hive與Hbase整合的示意圖如下: 
這裡寫圖片描述

 
2、Hive與Hbase整合—-Hive繫結Hbase中的table 
在Hive與Hbase整合的過程中,核心的步驟就是通過Hive繫結Hbase中的table表,繫結完之後,我們就可以通過Hive這個客戶端工具對Hbase中的表進行查詢了,那麼如何進行繫結呢?—-關鍵在於Hbase中的table如何和hive中建立的table在column級別上建立對映關係。 
假設現在在Hbase中有一張表:hbasetable,其資料模型如下: 
這裡寫圖片描述 
對於這張表hbasetable,我們在Hive中建立的對應的資料模型如下: 
這裡寫圖片描述 
其實從兩者的資料模型上來看建立column上的對映關係應該不是一件很難的事情,事實上確實不是很難,相應語法如下:

create external table hivetable(rowkey string, column1 string,column2 string,column3 string)   
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   
with serdeproperties("hbase.columns.mapping" = ":key,columnfamily1:column1,columnfamily1:column2,columnfamily2:column3")  
tblproperties("hbase.table.name"
="hbasetable");
  • 1
  • 2
  • 3
  • 4

語法具體含義: 
上面這個建表語句表示在Hive中建立一個外部表—名字叫做hivetable,與其在Hbase中建立對映關係的表名字為hbasetable,對映關係如下: 
hivetable —————————————hbasetable 
rowkey<—————>key (Hive中的rowkey欄位關聯到Hbase中的行健key) 
column1<————–>columnfamily1:column1 (hivetable中的column1對映到hbasetable中columnfamily1上的column1欄位) 
column2<————–>columnfamily1:column2 (hivetable中的column2對映到hbasetable中columnfamily1上的column2欄位) 
column3<————–>columnfamily2:column3 (hivetable中的column3對映到hbasetable中columnfamily2上的column3欄位) 
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ 的含義是:Hive與Hbase整合功能(互相通訊)的實現主要是通過hive_hbase-handler.jar這個工具類來完成的,而語法中的HBaseStorageHandler指的就是這個工具類。

這裡寫圖片描述

下面用一個具體的例項來說明如何通過Hive來繫結Hbase中的table: 
首先我們先在Hbase中建立一個表:customer–其資料模型以及內容如下: 
這裡寫圖片描述 
建立完表之後核實一下customer表中的內容,看是否建立成功:

hbase(main):001:0> scan 'customer'
ROW                            COLUMN+CELL
 xiaoming                      column=address:city, timestamp=1465142056815, value=hangzhou
 xiaoming                      column=address:country, timestamp=1465142078267, value=china
 xiaoming                      column=address:province, timestamp=1465142041784, value=zhejiang
 xiaoming                      column=info:age, timestamp=1465142102017, value=24
 xiaoming                      column=info:company, timestamp=1465142114558, value=baidu
 zhangyifei                    column=address:city, timestamp=1465142154995, value=shenzhen
 zhangyifei                    column=address:country, timestamp=1465142167587, value=china
 zhangyifei                    column=address:province, timestamp=1465142138872, value=guangdong
 zhangyifei                    column=info:age, timestamp=1465142183538, value=28
 zhangyifei                    column=info:company, timestamp=1465142200569, value=alibaba
2 row(s) in 0.7090 seconds
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

接著我們根據上面的語法在hive中建立對應的表hive_customer,語法實現如下:

hive>  create external table hive_customer(rowkey string, city string,country string,province string,age string,company string)
    >  stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    >  with serdeproperties("hbase.columns.mapping" = ":key,address:city,address:country,address:province,info:age,info:company")
    >  tblproperties("hbase.table.name"="customer");
  • 1
  • 2
  • 3
  • 4

通過上面的語法我們就可以在hive中建立對應的表hive_customer了,現在我們檢視一下表結構:

hive> describe hive_customer;
OK
rowkey  string  from deserializer
city    string  from deserializer
country string  from deserializer
province        string  from deserializer
age     string  from deserializer
company string  from deserializer
Time taken: 0.068 seconds
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

即: 
這裡寫圖片描述 
從上面的這個表結構可以看出,在hive表與hbase表整合的過程中,無非就是建立一個對映關係而已。 
現在我們在hive中檢視一下hive_customer表的內容: 
這裡寫圖片描述 
很明顯,hive中表的內容和我們預期想的是一樣的,上面這個sql操作由於是全表操作,並沒有走MapReduce程式,下面我們實現一個走MapReduce程式的sql操作: 
查詢hive_customer表中xiaoming的相關資訊: 
執行操作:

hive> select * from hive_customer
    > where rowkey="xiaoming";
  • 1
  • 2

然而hive的執行結果並沒有我們像的這麼順利,丟擲了下面的異常: 
這裡寫圖片描述 
這是為什麼呢?—其實對於這個問題也是一個經驗的總結,下面將進入我們部落格的第三個部分。 
3、如何處理異常—–從而使hive與hbase能夠順利的進行相互訪問 
有必要先介紹一下本次實驗的執行環境: 
hadoop-1.1.2 (單點部署) 
hbase-0.94.7-security (單點部署) 
hive-0.9.0 (MetaStore 配置為mysql資料庫) 
注:下面的方法對於叢集來說同樣適用! 
解決步驟: 
①檢視異常中的路徑(即異常的URL地址)

http://hadoop80:50060/tasklog?taskid=attempt_201606042144_0002_m_000000_3&start=-8193   
將其修改為:
http://hadoop80:50060/tasklog?
attemptid=attempt_201606042144_0002_m_000000_3&start=-8193
  • 1
  • 2
  • 3
  • 4

然後在網頁中檢視異常的具體情況: 
這裡寫圖片描述 
②從頁面的提示:Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.hbase.HBaseSplit 可以看出明顯是缺少某個jar包,這個jar包到底是什麼呢? 
③這幾個jar包分別是:

zookeeper-3.4.5.jar
hbase-0.94.7-security.jar
hbase-0.94.7-security-tests.jar
protobuf-java-2.4.0a.jar
  • 1
  • 2
  • 3
  • 4

注意:上面這幾個jar包指的是hbase(hbase-0.94.7-security )本身自帶的幾個jar包,然後將這4個jar包拷貝到hive/lib的目錄下(注意:如果在hive/lib的目錄下已經存在這幾個檔案的其他版本(例如hbase-0.92.0.jar、hbase-0.92.0-tests.jar、zookeeper-3.4.3.jar—先將hive自帶的這幾個版本刪除掉,然後在拷貝hbase下的相關版本) 
④在hive/conf的hive-site.xml檔案中,新增如下內容:

<property>  
  <name>hive.aux.jars.path</name>   
  <value>file:///usr/local/hive/lib/zookeeper-3.4.5.jar,file:///usr/local/hive/lib/hbase-0.94.7-security.jar,file:///usr/local/hive/lib/hbase-0.94.7-security-tests.jar,file:///usr/local/hive/lib/protobuf-java-2.4.0a.jar,file:///usr/local/hive/lib/hive-hbase-handler-0.9.0.jar</value>  
</property>
  • 1
  • 2
  • 3
  • 4

注意:通過上面的這幾行配置檔案,可以載入Hive預設沒有載入的這4個jar包(zookeeper-3.4.5.jar、 
hbase-0.94.7-security.jar、hbase-0.94.7-security-tests.jar、protobuf-java-2.4.0a.jar),但是在這裡我有一點一直沒有搞懂:hive-hbase-handler-0.9.0.jar這個jar包在hive中預設已經添加了,但是我們在編寫配置檔案的時候還必須寫上,否則業務開發中就會出錯–如果有知道這個原因的博友,歡迎留言。 
⑤拷貝zookeeper-3.4.5.jar、hbase-0.94.7-security.jar、hbase-0.94.7-security-tests.jar、protobuf-java-2.4.0a.jar這四個jar包到所有hadoop節點的lib目錄下(我本次實驗的時候用的是單點,所以就拷貝一個)。 
⑥拷貝hbase/conf下的hbase-site.xml檔案到所有hadoop節點conf目錄下。 
⑦重啟hadoop、hbase、hive。 
經過上面7個詳細的步驟,這個異常問題我們就徹底解決了,下面我們在重新執行一下業務: 
查詢hive_customer表中xiaoming的相關資訊: 
操作: 
這裡寫圖片描述 
OK!到這裡我們就順利的獲取到了我們希望的結果了! 
針對本篇部落格,如有問題,歡迎留言指正!