前言
公司数据中心搭建了一套Greenplum数仓,而我们团队有许多数据目前依赖别人的数仓进行抽取和提供,由于源数据库在内网,跟公司GP网络并不互通,因此想要利用一个可以同时访问两边数据的服务器作为ETL服务器,进而实现数据同步。同事对GP的数据加载速度赞不绝口,因此决定研究下GP的数据加载方式gpload,刚好可以访问两边数据的服务器是一台windows,因此有了此文排雷过程记录。
安装‘Greenplum Clients for Windows’
Greenplum Clients for Windows 是GP官方发布的GP客户端组件,包含了连接GP的驱动以及我们要用的gpload工具。到官网‘https://network.pivotal.io/products/pivotal-gpdb#/releases/683946/file_groups/2661’进行下载,下载需要注册和登录账号,按提示操作即可。
下载完后直接双击运行安装,安装完成后目录如下:
其中‘greenplum_clients_path.bat’是环境变量配置的批处理文件,安装后需要运行一下。
另外,这个工具是依赖与Python的,因此需要安装Python,经测试Python 2.6.5可以正常运行,python 2不会向Python3那样安装时可以勾选添加环境变量,因此安装后记得手动添加一下。
环境配置好后如果一切正常的话在命令行直接输入‘gpload -?’可以看到gpload帮助信息,但往往没那么顺利。
爬坑记录
1、Python版本问题
如下图提示,肉眼看起来Python异常捕获这样写并无问题,更换Python版本后就没问题了。
2、包引入BUG
提示 ‘pload was unable to import The PyGreSQL Python module (pg.py) ’ ,我们找到gpload.py文件的第36行,发现只从pygresql包引入了pg:
try:
from pygresql import pg
except Exception, e:
errorMsg = "gpload was unable to import The PyGreSQL Python module (pg.py) - %s\n" % str(e)
sys.stderr.write(str(errorMsg))
errorMsg = "Please check if you have the correct Visual Studio redistributable package installed.\n"
sys.stderr.write(str(errorMsg))
sys.exit(2)
将其改成直接引入包或从包引入所有
try:
from pygresql import *
#import pygresql
except Exception, e:
errorMsg = "gpload was unable to import The PyGreSQL Python module (pg.py) - %s\n" % str(e)
sys.stderr.write(str(errorMsg))
errorMsg = "Please check if you have the correct Visual Studio redistributable package installed.\n"
sys.stderr.write(str(errorMsg))
sys.exit(2)
3、权限问题
Windows上权限比较难搞,遇到‘WindowsError:[Error 5]’问题既是权限问题,根据错误提示找到pgload.py里面有一段创建日志文件存放目录的代码:
# default to gpAdminLogs for a log file, may be overwritten
if self.options.l is None:
self.options.l = os.path.join(os.environ.get('HOME', '.'),'gpAdminLogs')
if not os.path.isdir(self.options.l):
os.mkdir(self.options.l)
self.options.l = os.path.join(self.options.l, 'gpload_' + \
datetime.date.today().strftime('%Y%m%d') + '.log')
其中os.environ.get(‘HOME’, ‘.’)是获取当前用户目录,担心因为不是管理员导致用户目录权限不够,因此其改成存放在安装目录下:
# default to gpAdminLogs for a log file, may be overwritten
if self.options.l is None:
self.options.l = os.path.abspath('.')
#if not os.path.isdir(self.options.l):
# os.mkdir(self.options.l)
self.options.l = os.path.join(self.options.l, 'gpload_' + \
datetime.date.today().strftime('%Y%m%d') + '.log')
结果还是报错,后面将greenplum客户端安装目录权限分配给所有用户,终于解决。