Phoenix 數據導入與導出


來源於  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

  1. Zookeeper 端口配置

    zk1:2181,zk2:2181,zk3:2181
    
    • 1
  2. Kerberos 認證

    開啟 Keberos 模塊的場景下,需要提前在 Pig 所在服務器下進行 kinit 操作

  3. 數據導出導入順序保證

  4. 報錯:org.apache.pig.PigServer - exception during parsing: Error during parsing. null Failed to parse: null

    一般是語法錯誤導致的。

  5. 報錯:ERROR org.apache.pig.tools.grunt.GruntParser - ERROR 0: java.io.IOException: java.lang.RuntimeException: java.lang.Integer cannot be coerced to TINYINT

    這個問題就無法解決了,目標表的不能使用 TINYINT 類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM