標籤:
1. 是否存在高效的csv匯出工具?
phoenix提供了BulkLoad工具,使得使用者可以將大資料量的csv格式資料高效地通過phoenix匯入hbase,那麼phoenix是否也存在高效匯出csv資料的工具類呢?
這裡可能有人會想是否能夠按照匯出常規hbase的方法來匯出資料。比如自己寫Java代碼,或者用hbase原生支援的工具類,或者說採用pig提供的hbase工具類。是否能這麼幹取決於你phoenix建表時候欄位的資料類型。如果欄位採用的不是varchar、char等字元類型以及unsigned_*類型,或者你的表是salted table,那麼脫離phoenix的匯出方式必然會導致匯出的資料不正確。原因在於phoenix處理大部分資料類型資料位元組格式化的方式與原生hbase不一樣。比如,phoenix salted table會在rowkey的第一個位元組插入hash值來使資料均勻分布到每一個region上,所以用常規hbase匯出工具匯出勢必造成rowkey的匯出不正確。
2. Pig Loader——最優且唯一的Phoenix匯出csv檔案工具
幸運的是phoenix官方確實提供了一個高效的匯出工具類,但是必須依賴於pig。而且在實驗過程,也就發現只有這個唯一的工具可以完美地支援phoenix表資料的匯出。
關於pig的介紹以及使用不是這篇文章的重點,沒有接觸過的朋友請自行百度或者google檢索。
phoenix整合pig的介紹可以在下面的官網連結查看:
https://phoenix.apache.org/pig_integration.html
裡面提到了兩個工具方法,一個用于海量資料的匯入,類似於BulkLoad工具,另外一個工具方法用于海量資料的匯出。這裡我們關注資料的匯出。
匯出工具號稱為 Pig Loader。根據官網上的介紹:
A Pig data loader allows users to read data from Phoenix backed HBase tables within a Pig script.
意思是我們可以編寫pig指令碼並使用phoenix-pig(phoenix繼承pig的模組)提供的工具類來運行pig指令碼實現海量資料的匯出。
Pig Loader有兩種形式實現匯出:
2.1 export using table
第一種是通過指定hbase表名來匯出整個表資料,例如我想匯出TEST表的所有記錄,那麼可以用如下的指令碼命令:
A = load ‘hbase://table/USER‘ using org.apache.phoenix.pig.PhoenixHBaseLoader(‘${zookeeper.quorum}‘);
需要將${zookeeper.quorum}替換成zookeeper叢集機器ip加連接埠,eg: master,slave1,slave2:2181
當然我們還可以精確控制只匯出表的哪幾個列:
A = load ‘hbase://table/USER/ID,NAME‘ using org.apache.phoenix.pig.PhoenixHBaseLoader(‘${zookeeper.quorum}‘);
上面的指令碼表示匯出TEST表所有記錄,但僅包含ID列和NAME列。
2.2 export using query
另外一種是通過指定query語句來控制匯出的資料:
A = load ‘hbase://query/SELECT ID,NAME FROM USER WHERE AGE > 50‘ using org.apache.phoenix.pig.PhoenixHBaseLoader(‘${zookeeper.quorum}‘);
【注意】
使用query語句指定的匯出方式存在很大的限制,比如說不能指定GROUP BY , LIMIT , ORDER BY , DISTINCT ;同時也無法指定使用彙總函式,如count,sum等。
3. 使用樣本
下面我們通過兩個完整的使用樣本介紹兩種匯出方式的使用。Example1示範指定table方式的匯出,而Example2示範指定query方式的匯出。
3.1 Example1
vi example1.pigREGISTER /data/phoenix-default/phoenix-4.6.0-HBase-1.0-client.jar;rows = load ‘hbase://table/USER‘ USING org.apache.phoenix.pig.PhoenixHBaseLoader(‘master,slave1,slave2:2181‘);STORE rows INTO ‘USER.csv‘ USING PigStorage(‘,‘);
執行shell命令:
pig -x mapreduce example1.pig
3.2 Example2
vi example2.pigREGISTER /data/phoenix-default/phoenix-4.6.0-HBase-1.0-client.jar;rows = load ‘hbase://query/SELECT ID,NAME FROM USER‘ USING org.apache.phoenix.pig.PhoenixHBaseLoader(‘master,slave1,slave2:2181‘);STORE rows INTO ‘USER.csv‘ USING PigStorage(‘,‘);
執行shell命令:
pig -x mapreduce example2.pig
Phoenix 匯出csv檔案