Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供完整的sql查詢功能,可以將sql語句轉換爲
MapReduce任務進行運行。其優點學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,
十分適合數據倉庫的統計分析。Hive與HBase的整合功能的實現是利用兩者本身對外的API接口互相進行通信,相互通信主要是依靠hive_hbase-handler.jar工具類.
Hive Hbase整合 見官網 Hive HBase Integration:https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration 。
具體步驟整理如下:
集成步驟:
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步,我曾經忘了這一步 搞了半天!
單節點啓動:
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的方式實現數據的插入。
nsert 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
好,先到這。