1. 程式人生 > >Daniel 的技術筆記 不積跬步無以至千里,不積小流無以成江海。

Daniel 的技術筆記 不積跬步無以至千里,不積小流無以成江海。

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為

MapReduce任務進行執行。其優點學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,

十分適合資料倉庫的統計分析。Hive與HBase的整合功能的實現是利用兩者本身對外的API介面互相進行通訊,相互通訊主要是依靠hive_hbase-handler.jar工具類.

具體步驟整理如下:

整合步驟:

hbase 版本為 0.94.6.1 hive 0.11.0

1,首先將hbase-0.94.6.1/ 目錄下的  hbase-0.94.6.1.jar 和 hbase-0.94.6.1/lib下的 zookeeper-3.3.5.jar複製到hive/lib目錄下。

    注意:如果hive/lib下已經存在這兩個檔案的其他版本(例如zookeeper-3.3.3.jar),建議刪除後使用hbase下的相關版本.

2,在hive/conf下hive-site.xml檔案中新增如下的內容:

 如果hive/conf 目錄下沒有hive-site.xml 則把此目錄下的hive-default.xml.template拷貝一份並命名 為hive-site.xml。

<property>
  <name>hive.aux.jars.path</name>  
  <value>
         file:///root/hive-0.11.0/lib/hive-hbase-handler-0.11.0.jar,
         file:///root/hive-0.11.0/lib/hbase-0.94.6.1.jar,
         file:///root/hive-0.11.0/lib/zookeeper-3.3.5.jar
  </value>
</property>
3. 拷貝hbase-0.94.6.1.jar到所有hadoop節點(包括master)的hadoop/lib下。

4. 拷貝hbase/conf下的hbase-site.xml檔案到所有hadoop節點(包括master)的hadoop/conf下

注意,如果3,4兩步跳過的話,執行hive時很可能出現如下錯誤:

FAILED: Error in metadata: MetaException(message:org.apache.hadoop.hbase.MasterNotRunningException: ubuntu.ubuntu-domain:60000
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:394)
    at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:83)
    at org.apache.hadoop.hive.hbase.HBaseStorageHandler.getHBaseAdmin(HBaseStorageHandler.java:74)
    at org.apache.hadoop.hive.hbase.HBaseStorageHandler.preCreateTable(HBaseStorageHandler.java:158)
    at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.createTable(HiveMetaStoreClient.java:344)

   不要忘記第3 4步,我曾經忘了這一步  搞了半天!

現在可以嘗試啟動Hive了。

單節點啟動:
1  > bin/hive -hiveconf hbase.master=localhost:60000

叢集啟動:
1 > bin/hive -hiveconf hbase.zookeeper.quorum=slave1,slave2,slave3,slave4

測試:

 5,測試:

  A, 建立關聯表,這裡我們要查詢的表在hbase中已經存在所以,使用CREATE EXTERNAL TABLE來建立,如下:

CREATE EXTERNAL TABLE hbase_table_1(key string, value string)   
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "data:1")   
TBLPROPERTIES("hbase.table.name" = "hbase_test"); 
hbase.columns.mapping指向對應的列族;多列時,data:1,data:2;多列族時,data1:1,data2:1;

 hbase.table.name指向對應的表;hbase_table_2(key string, value string),這個是關聯表。

我們看一下HBase中要查詢的表的結構:

    hbase(main):001:0> describe 'hbase_test'  
    DESCRIPTION                                                             ENABLED                                 
     {NAME => 'hbase_test', FAMILIES => [{NAME => 'data', COMPRESSION => 'NONE',  true                                    
     VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY                                          
     => 'false', BLOCKCACHE => 'true'}]}                                                                            
    1 row(s) in 0.0810 seconds  
    hbase(main):002:0>  

看一下Hbase表中的資料:

    hbase(main):002:0> scan 'hbase_test'  
    ROW                          COLUMN+CELL                                                                        
     row11                        column=data:1, timestamp=1300847098583, value=value11                               
     row12                       column=data:1, timestamp=1300849056637, value=value12                               
     row21                        column=data:2, timestamp=1300847106880, value=value21                               
    3 row(s) in 0.0160 seconds  
    hbase(main):003:0>   

列族:data:1、data:2兩個, Key:row1、row12、row21,alue:value1、value12、value21

 hbase_table_1(key string, value string)中對應的test表中的row,value欄位對應的是hbase_test表中的value

現在可以來看看查詢結果了。

我們在hive命令列中先檢視一下hbase_table_1:

    hive> select * from hbase_table_1;  
    OK  
    row11    value11  
    row12   value12  
    Time taken: 0.197 seconds  
    hive>  
對比一下hbase_test表中的列族為data:1的資料:
row11                        column=data:1, timestamp=1300847098583, value=value11                               
row12                       column=data:1, timestamp=1300849056637, value=value12

和查詢結果相符。

B,建立hbase識別的資料庫:

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

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

在hbase中查看錶是否建立成功:

hbase(main):004:0> list
TABLE    

hbase_test                                                                       
test_hive

1 row(s) in 0.0110 seconds

hbase(main):005:0> describe 'test_hive'
DESCRIPTION                                          ENABLED                    
 {NAME => 'test_hive', FAMILIES => [{NAME => 'cf1',  true                       
 BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', CO                            
 MPRESSION => 'NONE', VERSIONS => '3', TTL => '21474                            
 83647', BLOCKSIZE => '65536', IN_MEMORY => 'false',                            
  BLOCKCACHE => 'true'}]}                                                       
1 row(s) in 0.0300 seconds
匯入資料:
我們不能直接使用load data來將資料匯入到剛才建立的test_hbase表中,我們可以通過insert overwrite的方式實現資料的插入。

insert overwrite table test_hbase select * from test_join1;

在HBase中檢視通過hive匯入的資料是否成功scan 'test_hive'。

scan 'test_hive'
ROW                   COLUMN+CELL                                               
 1                    column=cf1:val, timestamp=1331278861290, value=SF   
 2                    column=cf1:val, timestamp=1331278861290, value=DANE       
 3                    column=cf1:val, timestamp=1331278861290, value=WANG     
 4                    column=cf1:val, timestamp=1331278861290, value=JULY    
 5                    column=cf1:val, timestamp=1331278861260, value=EVA     
 6                    column=cf1:val, timestamp=1331278861260, value=USTC    
6 row(s) in 0.6230 seconds

遇到的錯誤:

hive> show tables;

FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClientFAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

debug 模式重新啟動 hive,  執行命令:

./hive -hiveconf hive.root.logger=DEBUG,console

執行命令:

hive> show tables;

出現下面類似的錯誤:

hive error xsdb6 hive another instance of derby may have already booted the

解決方法:

到 hive-0.11.0 目錄下把檔案 夾 metestore_db 刪除,重新啟動 hive 即可 解決問題。

不過也可以 不使用預設的內嵌資料庫derby,採用mysql作為統計的儲存資訊。詳情移步到

好,先到這。

參考;

http://blog.csdn.net/jiedushi/article/details/7325292

http://victorzhzh.iteye.com/blog/972406