近期研究了下gpload在window下的使用问题(linux上就不说了,可以直接使用),由于该工具还是很方便的(能根据需要自动启停gpfdist、无需手动创建外部表),但最终没有成功入库,以下是分析尝试过程,供还想继续研究的做一下参考。
1、安装gpload
我安装的文件是greenplum-loaders-4.1.0.0-build-5-WinXP-x86_32.msi,可以自行下载,现在下载好像比较费事了,还需要注册等一系列繁琐事项,地址 http://gpn.greenplum.com,下一步就ok。安装成功之后,设置环境变量 GPHOME_LOADERS=C:\Program Files\Greenplum\greenplum-loaders-4.1.0.0-build-5
在PATH中添加 %GPHOME_LOADERS%bin
2、安装python
由于在window上要想使用gpload.py,需要先安装python,版本问题非常关键,根据adminguide所说,以及gpload.py中的提示,需要python2.4.4 or higher,结果开始我下载了python3.2,安装过程很简单,下一步就ok,安装成功之后,需要配置环境变量 PATH,将 C:\Python32\ 添加进去,并创建环境变量 PYTHONPATH ,
PYTHONPATH=%GPHOME_LOADERS%bin\lib
以下开始调试过程
由于python以前没接触过,所以这部分环境变量的设置也是经过n次的尝试,不过问题并没有解决,此时在cmd下,cd 到 %GPHOME_LOADERS%bin 目录下,执行gpload时,一直报错,except Exception, e: 这样的错误,开始以为是环境变量设置的问题,在经过最简单的 hello world测试之后,发现是版本的问题,helloworld.py内容如下:
#!/usr/bin/env python
print "hello world!"
--------报错 invalid syntax
所以,将python3.2卸载掉,安装python2.6,再次运行helloworld.py,测试通过。(后在linux服务器上,查看python安装的版本,发现也是2.6)由于版本问题,浪费了很多时间。
注意:
在cmd窗口下,cd到gpload目录下,执行gpload -f xxxx.yml文件(此处的yml文件是没有问题的,已经在linux下经过了验证),提示:
gpload needs pyyaml. You can get it from http://pyyaml.org.
这是由于开始时,设置了错误的PATH 和 PYTHONPATH所致,其实只是这两个环境变量的值顺序错了,这点我相信经常用linux和unix的朋友应该非常了解,系统在查找路径时,会从开始往后找,如果第一个就找到了,就不再往下查找了。
其实,我在这里写这个的目的是想说明一下yaml这个翻译器,在用yml脚本的时候,需要在安装完python后,再单独下载一个yaml解析器,这样才能正确翻译yml脚本的内容,下载地址http://pyyaml.org./,找到相应版本,很容易下载。
(注:安装gpload时,在gpload安装目录下,已经有了一个yaml,不需要单独安装了,只要将PATH 和PYTHONPATH设置正确就不会出这个问题了)
接下来,再次执行 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: 找不到指定的模块。
打开gpload.py,找到36行,将如下代码:
from pygresql import pg
改成:
# from pygresql import pg
import pygresql
或者
from pygresql import *
然后再次执行 gpload -f xxxx.yml,还是继续报错,如下:
2011-09-07 15:25:02|INFO|gpload session started 2011-09-07 15:25:02
2011-09-07 15:25:02|ERROR|could not connect to database: global name 'pg' is not defined. Is the Greenplum Database running on port 5432?
2011-09-07 15:25:02|INFO|rows Inserted = 0
2011-09-07 15:25:02|INFO|rows Updated = 0
2011-09-07 15:25:02|INFO|data formatting errors = 0
2011-09-07 15:25:02|INFO|gpload failed
该错误是出现在代码中第1543行,代码如下:
self.db = pg.DB( dbname=self.options.d
, host=self.options.h
, port=self.options.p
, user=self.options.U
, passwd=self.options.password
)
从错误信息来看,应该是 pg未定义造成的,而在代码中的 from pygresql import pg ,正是应该解决该问题的,然而确报错,具体原因就不得而知了,最终我觉得应该是这些脚本的问题。
另外,在GPHOME_LOADERS\bin\lib\pygresql 下,有2个文件我比较关注,其中一个是pg.py,另一个是__init__.py,其中pg.py定义了一个DB的class,代码中pg.DB的目的应该是引用该文件中的class,另一个文件__init__.py是空的,这个比较奇怪,按理说,这个应该是初始化用的才对,当然这也是我的猜测,我本人不懂python。
以上这些内容,也是我这几天的试验和分析,虽然最终没有成功,但也可以做些参考。如有哪位大侠将这个功能实现了的,还望留言提醒下,本人非常感谢。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10037372/viewspace-706906/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10037372/viewspace-706906/