1. 介紹
windows下分別用Kettle和cmd命令調用GPload。
1.1. 目的
使用gpload,一方面我們可以實現GREENPLUM中不能直接實現的merge操作,另外通過結合命名管道,我們可以實現無落地文件的並行快速加載。從而幫助我們提高海量數據加載效率,也避免了使用傳統落地文件方式加載的過大存儲開銷,以及超大文件落地過程導致的加載性能瓶頸
2. 安裝部署
2.1.安裝包准備
(1)python2.5.4版本
- GPload的加載程序(gpload.py)使用python寫的,並且windows下面GPload只支持python2.5.4版本,用其他版本運行會報異常;python的版本只能是32位,不然也會報異常。
(2)PyGreSQL-4.1.1.win-amd64-py2.5.exe
- greenplum的內核是PostGrelSql,這個組件是python調用PostGreSql使用
(3)PyYAML-3.10.win32-py2.5.exe
- 這個組件使用寫一些配置文件所使用如(*.yml)
(4)greenplum-loaders-5.15.1-WinXP-x86_32.msi
- 這個是windows下面GPload的安裝包
(5)pdi-ce-8.2.0.0-342
- 這個是kettle8.2的安裝包
2.2.軟件安裝
(1)python安裝:運行python安裝包,安裝到指定目錄,當安裝選擇用戶時,不要選擇for all users. 不然安裝PyGreSQL和PyYAML的python組件會找不到python注冊目錄。安裝完成打開cmd控制台輸入python,如果出現不是內部或外部命令,則請配置環境變量。
(2)PyGreSQL安裝:直接安裝exe文件,選擇用戶時也選擇"this user only"。
(3)PyYAML安裝:直接安裝就行,選擇用戶選擇"this user only"。
(4)gpload安裝:greenplum-loaders-5.15.1-WinXP-x86_32.msi直接安裝就行。
(5)kettle安裝:下載完成后Kettle解壓縮放置任意盤即可,雙擊spoon.bat運行。(已經安裝好jdk)
3.gpload使用
3.1.cmd命令模式下使用gpload
新建一個gpload.yml文件,內容如下:
DATABASE: gpdb name #gp數據庫名
USER: gpdb username #gp用戶名
HOST: gpdb host #gp數據ip地址
PORT: gpdb port #gp端口
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- file host #加載文件ip地址
FILE:
- gpload data file #文件地址
- COLUMNS: #加載的列
- id: varchar(50)
- ctif_tp: varchar(10)
- FORMAT: file format csv/text #文件格式csv/text
- DELIMITER: ',' #文件中數據分隔符
- ERROR_LIMIT: 100 #超過多少錯誤gpload停止
- LOG_ERRORS: True
OUTPUT:
- TABLE: test #gpdb表名
- MODE: insert #gpload處理方式 insert/update/merage
實例:
VERSION: 1.0.0.1
DATABASE: gp6
USER: gpadmin
HOST: hadoop100
PORT: 5432
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- 192.168.1.10
PORT: 8081
FILE: ['E:\greenplum\greenplum-loaders-5.28.0\load\load06.txt']--此文件需事先准備好
- COLUMNS:
- id:
- "name":
- FORMAT: TEXT
- DELIMITER: ','
- QUOTE: ''
- HEADER: FALSE
- ENCODING: UTF8
- ERROR_LIMIT: 50
OUTPUT:
- TABLE: dm.b
- MODE: insert
GPload使用要打開對應的gpfdist服務,運行bin目錄下的gpfdist.exe即可
打開控制台進入GPload的安裝bin目錄,調用命令 gpload.py -f gpload.yml。彈出輸入password密碼后GPload就會把數據插入GP數據庫。
3.2 kettle下使用gpload
新建一個kettle轉換,拖入表輸入和gpload組件,下一步進行配置gpload組件。
load method有兩個選項,Automatic load (at the end)代表自動執行gpload加載數據;Manual load (only creation of files)代表手動執行,只生成cfg.dat文件,需要手動執行gpload命令;cfg文件是gpload的yml文件,dat是需要加載的數據文件。
Erase cfg/dat files after use這個選擇是指使用后是否刪除cfg,dat文件 load action(加載方式):insert(插入),update(更新),merge(合並,存在更新,不存在則插入),update和merge需要在字段列表中至少存在一個字段match為true,用戶匹配更新的字段,match列后面還有一個update列,設為true表示遇到更新的記錄行更新該字段。 注意:kettle里面的gpload字段的match和update好像設置無效,改為“是”保存在打開又變成了“否”,導致無法增量更新。目前解決方案是:直接修改轉換文件,找到字段映射那塊,手動修改為Y,暫時解決問題,可增量更新。
local host配置:port為gpfdist使用的端口,host為gpfdist的ip,不要使用127.0.0.1,使用的ip必須得greenplum庫能ping通,port建議不設置,默認會在8000-9000選取可用端口,如果設置了port,需保證gpload並行執行時使用的端口不同,不然會端口沖突,導致失敗。
path to the gpload :E:\greenplum\greenplum-loaders-5.28.0\bin\gpload.py control file :E:\greenplum\greenplum-loaders-5.28.0\bin\control07.cfg ---生成cfg文件保存的地址及control文件名
error table:不填 ---加載出現錯誤的數據,填寫了會自動在gp庫中創建改表,加載錯誤的數據會存到改表中
log file :E:\greenplum\greenplum-loaders-5.28.0\log\log8.txt ---gpload運行日志
data file :E:\greenplum\greenplum-loaders-5.28.0\load\load08.txt---生成的dat數據文件地址及dat文件名
Null as:不填---null值替換
encoding:utf-8---編碼
max errors:50 ---允許錯誤數量
delimiter:逗號---數據字段列分隔符,建議使用一些特殊的字段,避免數據中存在該字符,倒是加載數據出現錯誤,或在執行gpload之前將數據中的特殊字符替換掉
配置完后保存轉換,進入gp服務器中。
su - gpadmin
vi /home/gpadmin/.bash_profile
在最后添加一行:
export PGPASSWORD=atguigu(此處是你gp庫gpadmin用戶的密碼)
讓環境變量生效:
source .bash_profile
最后在kettle中啟動轉換,可以看到轉換已完成,數據已入庫。
4.問題解決方案
4.1.錯誤設置PATH 和 PYTHONPATH
在cmd窗口下,cd到gpload目錄下,執行gpload -f xxxx.yml文件(此處的yml文件是沒有問題的,已經在linux下經過了驗證),提示:
gpload needs pyyaml. You can get it from http://pyyaml.org.
這是由於開始時,設置了錯誤的PATH 和 PYTHONPATH所致,其實只是這兩個環境變量的值順序錯了,這點我相信經常用linux和unix的朋友應該非常了解,系統在查找路徑時,會從開始往后找,如果第一個就找到了,就不再往下查找了
4.2.python版本問題
執行 gpload -f xxxx.yml,報錯,如下:
C:\Python26>gpload.py -f r_ne_cell_c_bj.yml
gpload was unable to import The PyGreSQL Python module (pg.py) - DLL load failed: 找不到指定的模塊。
這是由於安裝的python環境不是2.5.4所致,安裝正確的版本即可
4.3.不能連接文件服務器問題
設置的hostname一定要是內網ip,因為通過gpfdist創建的服務文件是通過IP來創建的,該IP是一個外網的IP,而子節點是在內網上面的,
不能訪問到外網的IP,重新把IP修改為內網IP后,重新導入,成功。