关于greenPlum中通过gpfdist导入数据不成功的问题与原因

来源:互联网 发布:淘宝mp3 编辑:程序博客网 时间:2024/06/11 15:57

注:该文章转自http://blog.sina.com.cn/s/blog_79d599dc0100qfgz.html


关于greenPlum中通过gpfdist导入数据不成功的问题与原因

 

先前日志里面应该讲过一个对greenPlum数据库通过copy导入数据到数据库出现错误的原因。刚才查了一下日志,发现竟然没有。

干脆借这个机会一起再写一次,也算是给自己的回顾吧。

 

对于greenPlum数据库,在BI的ETL应用中,把文件导入数据库是构建数据仓库的必经之路。对于GP(greenPlum后简称GP)有两种

导入数据库的方式:一是通过gpfdist创建外部表;二是通过copy命令;

 

前段时间写了一个程序用于把数据导入到GP中,最初版本只提供了gpfdist方式导入,后因现场人员对gpfdist不熟悉,说部署起来

太麻烦,要求提供更简便的方式,于是修改程序两点:一是增加一种通过copy方式导入,二是程序里面自动的启动gpfdist服务,而

不用维护人员手工启动。以增加程序的可维护性。

 

先说第一个问题:就是碰到通过copy导入数据的时候报错,印象中报的是文件没有操作的权限。根据报出来的错误信息去查。

首先查是否可以读取该文件,发现是可以读取的。但不知道为什么就是报文件没有操作权限。

通过GP的文档,详细看了后,发现里面指的可操作的权限指的是连接数据库的用户,我在本机上的用户是gpadmin,但是连接数据库

的是另外的一个用户cluster,重新查看文件的权限,该文件也是其他用户可读的,但还是报错。实在没办法,只有把文件给了777权限,

本想这下总该可以啦,但实际上,还是报错。同样的问题。

最后只得看着文件想,终于,因为linux下面,文件有没有权限可操作,还跟文件所在的目录有关系,如果一个文件是所有权限都有的,

但是文件所在的目录或上层目录对某个用户没有操作,那么该用户同样不可以操作该文件。再去查文件所在的目录,果然,对cluster

用户来说,该目录没有操作权限,给了可执行权限后,再去copy导数,成功。

 

上面第一点总的来说通过copy导数有两点:

一、文件的权限是对连接数据库的用户来讲的;

二、文件的权限与linux平台是相关的。

要保证以上两点,copy才能对文件进行操作。

 

昨天碰到了第二个问题是关于gpfdist导数的。

以前也碰到过gpfdist导数不成功的问题,以前的问题主要有两点:

1、gpfdist服务指定的目录不对。

2、gpfdist服务没启动(由于某原因关闭了)

这两个问题都好解决,而且也好查,第一点一般会报文件不存在;第二点一般报 error code = 115 (Operation now in progress) 

而且也好检查。

昨天碰到的情况是gpfdist导数失败后,日志里没报什么信息出来,如下:

ERROR:  connection with gpfdist failed for gpfdist://133.37.253.111:8081/gpdata/test_gpfdist.txt. 

effective url:  http://133.37.253.111:8081/gpdata/test_gpfdist.txt. 

(url.c:258)  (seg7 slice1 sdw2-4:50004 pid=10033)],

error sql[select * from public.test_ext],

sql state[01000],variable info[]

 

根据以上错误,根本看不出有啥问题。首先目录肯定是对的,因为以前跑成功过。

首先就着以前的思路,去想是否是目录没有权限或是目录不存在呢?去现场机器上核查,目录是存在的,而且也是有权限的这点确认。

再就是想是否是gpfdist服务过早退出或是启动失败了呢?于是手工启动服务,然后再去调用,发现还是失败。

两种情况都不是。

把错误信息拿到google或baidu里面查,也查不出什么东西。可能主要还是因为里面没报错误信息出来。

没办法,只有再次去查看一下 gpfdist命令的用户 。

输入 gpfdist --help

一个一个参数的查。目录是对的,后面的端口呢?有没有被占用。

输入netstat -ltn | grep port

发现端口是正常的,没有被占用。

再往后面就是日志文件,一查,原来日志文件的目录不存在,重新要求新建日志目录,再次运行 。

本以为可以了,没想到,还是报错。报同样的错误。

 

这下彻底没辙了。

 

于是找了另一台机器把所有的代码拿过来试跑一次,可以跑通。说明代码肯定是没问题。那么问题就是出在环境上面啦。

 

重新去读一下GP的手册,发现里面有一句话:

For readable external tables ,gpfdist parses and serves data files evenly to all the segment instances in the Greenplum Database

system wheren users SELECT from the external table.

意思大概就是,要是读取外部表,那么gpfdist服务器上的文件就必须被所有的子节点能访问。

 

因现场有两个节点,所以再回去看看节点的情况,通过gpfdist创建的服务文件是通过IP来创建的,该IP是一个外网的IP,而子节点是在内网上面的,

不能访问到外网的IP,重新把IP修改为内网IP后,重新导入,成功。

 

总结上面第二个问题,通过gpfdist导入数据的时候。需要以下三种:

1、gpfdist目录必须创建对;

2、gpfdist必须启动后;

3、所有子节点的机器要能通过gpfdist所指定的地址对GP服务文件进行访问。也就是能访问GPFDIST服务上面外部表文件的机器。

原创粉丝点击