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后,重新导入,成功。