來源於 https://www.pianshen.com/article/1151406725/
Phoenix 數據導入與導出
Phoenix 官方提供了相應的導入和導出的方案,分別位於:
導入:https://phoenix.apache.org/bulk_dataload.html
導入、導出:https://phoenix.apache.org/pig_integration.html
導出需要依賴 Apache Pig
相應進行實現。我們先來聊聊如何導出吧。
**環境:**HDP 3.0.0、HBase 2.0.0、Phoenix 5.0.0、Pig 0.16.0
導出
Phoenix 官方提供的 Pig 方案,看似很簡單,其實還是有很多需要注意的地方,比較官方給的都是最簡單的示例,而實際應用場景的時候,會碰到很多意想不到的問題。我在本文就講講我的實現方法和遇到的坑吧。
以下操作需要先安裝 Pig 環境。
test.pig
REGISTER /usr/hdp/3.0.0.0-1634/hbase/lib/*.jar; REGISTER lib/*.jar; rows = load 'hbase://table/DOP_VISIT_INFO_V2' USING org.apache.phoenix.pig.PhoenixHBaseLoader('dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org');
- 1
- 2
- 3
- REGISTER:注冊所需要的包,官方示例中沒有響應的體現,在使用過程中,如果遇到找不到類的相關問題,一般就是包不存在導致的,可以通過 REGISTER 進行引用,並且支持相對路徑和模糊匹配哦。
hbase://table/DOP_VISIT_INFO_V2
:是指需要備份的表,如果是全表就用hbase://table
,后面跟表名,這里就是DOP_VISIT_INFO_V2
查詢的結果導出則用hbase://query
,后面跟查詢語句。PhoenixHBaseLoader 參數
:ZooKeeper 地址。
執行語句:
pig -x mapreduce test.pig
- 1
相應的導出的數據是存儲在 HDFS 上,需要留意一下腳本執行完以后相應的日志中會有體現。
CSV
REGISTER /usr/hdp/3.0.0.0-1634/hbase/lib/*.jar; REGISTER lib/*.jar; rows = load 'hbase://table/DOP_VISIT_INFO_V2' USING org.apache.phoenix.pig.PhoenixHBaseLoader('dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org'); STORE rows INTO 'dop_visit_info_v2.csv' USING PigStorage(',');
- 1
- 2
- 3
- 4
STORE rows INTO 'dop_visit_info_v2.csv' USING PigStorage(',')
:導出到 HDFS 的文件路徑和數據存儲格式,這里就是存放 dop_visit_info_v2.csv
目錄下,這里千萬注意,這是一個文件夾,而不是一個 csv
文件,起初,我也很單純的以為,Too Young,使用逗號進行分隔。
Query
REGISTER /usr/hdp/3.0.0.0-1634/hbase/lib/*.jar; REGISTER lib/*.jar; rows = load 'hbase://query/select * DOP_VISIT_INFO_V2 where age >18' USING org.apache.phoenix.pig.PhoenixHBaseLoader('dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org');
- 1
- 2
- 3
注意: 使用query語句指定的導出方式存在很大的限制,比如說不能指定 GROUP BY , LIMIT , ORDER BY , DISTINCT
;同時也無法指定使用聚合函數,如 count,sum
等。
數據校驗
數據存儲在 HDFS 下哦。
hdfs dfs -cat '/dop_visit_info_v2.csv/part-m-00000'
- 1
導入
Pig 方式
Phoenix 支持使用 Pig StoreFunc 實現 bulk upload
數據導入。
REGISTER /usr/hdp/3.0.0.0-1634/hbase/lib/*.jar; REGISTER lib/*.jar; A = load 'gejx.csv' USING PigStorage(',') as (ID:chararray, DOP_VISIT_VISITID:chararray); STORE A into 'hbase://GEJX_TEST' using org.apache.phoenix.pig.PhoenixHBaseStorage('dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org','-batchSize 100');
- 1
- 2
- 3
- 4
- 5
gejx.csv
:導出的數據存儲路徑hbase://GEJX_TEST
:導入的表-batchSize 100
:upsert 批量條數ID:chararray, DOP_VISIT_VISITID:chararray
:字段名稱與類型映射關系,這里的字段名是屬於 GEJX_TEST 表中的字段,也就是目標持久化的表名USING PigStorage(',')
:可選,如果是使用上方 CSV 導出方式,則需要加上
注意: 表需要提前創建哦,否則,會報表不存在。
數據類型
Pig 數據類型默認是 chararray,常用數據類型為:int、long、float、double、chararray、bytearray、map、tuple、bag。
詳細查看 pig 數據類型 。
如果 Phoenix 表中存在 null 值,通過 Pig 方式導入導出數據會存在 null 變成了空字符串。
MR
在使用 https://phoenix.apache.org/bulk_dataload.html 中 MR 方式時,由於 HDP 環境開啟了 Kerberos 模式,一直遇到了認證的問題,后來發現支持 -D
的語法,不過這里需要注意的是一定要放在 hadoop jar 參數命令之前,否則會報沒有這個命令的錯誤。
hadoop jar /usr/hdp/3.0.0.0-1634/phoenix/phoenix-5.0.0.3.0.0.0-1634-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool -Dhbase.master.kerberos.principal=hbase/_HOST@DEV.ORG -Dhbase.regionserver.kerberos.principal=hbase/_HOST@DEV.ORG -Dhadoop.security.authentication=kerberos -Dhbase.security.authentication=kerberos -Dphoenix.schema.isNamespaceMappingEnabled=true -Dphoenix.schema.mapSystemTablesToNamespace=false -Dphoenix.queryserver.withRemoteUserExtractor=true --table GEJX_TEST --input /user/dmpadmin/gejx.csv -z dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org:/hbase-secure
- 1
phoenix-5.0.0.3.0.0.0-1634-client.jar
該包是存放在 Phoenix 安裝目錄下的,並不是 lib 目錄。
高級
以上的方式導入和導出是相互割裂的,而有一種場景在生產上也碰到的很多,就是表與表之間的數據同步,比如,現在有兩張表 A 表和 B 表,表部分字段一樣,字段名稱不一樣,現在需要將 A 表中的數據同步到 B 表,我們也可以通過 Pig 方式實現。
REGISTER /usr/hdp/3.0.0.0-1634/hbase/lib/*.jar; REGISTER lib/*.jar; A = load 'hbase://query/select * from GEJX' USING org.apache.phoenix.pig.PhoenixHBaseLoader('dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org'); STORE A into 'hbase://GEJX_TEST' using org.apache.phoenix.pig.PhoenixHBaseStorage('dev-dmp3.fengdai.org,dev-dmp4.fengdai.org,dev-dmp5.fengdai.org','-batchSize 100');
- 1
- 2
- 3
- 4
- 5
將導入和導出放在一起進行操作,batchSize 可以根據實際情況進行相應的調整。
Q&A
-
Zookeeper 端口配置
zk1:2181,zk2:2181,zk3:2181
- 1
-
Kerberos 認證
開啟 Keberos 模塊的場景下,需要提前在 Pig 所在服務器下進行 kinit 操作
-
數據導出導入順序保證
-
報錯:
org.apache.pig.PigServer - exception during parsing: Error during parsing. null Failed to parse: null
一般是語法錯誤導致的。
-
報錯:
ERROR org.apache.pig.tools.grunt.GruntParser - ERROR 0: java.io.IOException: java.lang.RuntimeException: java.lang.Integer cannot be coerced to TINYINT
這個問題就無法解決了,目標表的不能使用 TINYINT 類型。