使用Greenplum的并行文件服务器(gpfdist)

使用Greenplum的并行文件服务器(gpfdist)

gpfdist协议用于CREATE EXTERNAL TABLE SQL命令,以访问Greenplum Database gpfdist文件服务器实用程序提供的外部数据。 当外部数据由gpfdist提供时,Greenplum数据库系统中的所有节点都可以并行读取或写入外部表数据。

本主题介绍将gpfdist与外部表一起使用的设置和管理任务。

关于gpfdist和外部表

gpfdist文件服务器实用程序位于Greenplum数据库主节点和每个节点上的$GPHOME/bin目录中。 启动gpfdist实例时,您指定一个侦听端口以及一个包含要读取的文件或要写入文件的目录的路径。 例如,此命令在后台运行gpfdist,侦听端口8801,并在/home/gpadmin/external_files目录中提供文件:

$ gpfdist -p 8801 -d /home/gpadmin/external_files &

CREATE EXTERNAL TABLE命令LOCATION子句将外部表定义连接到一个或多个gpfdist实例。 如果外部表是可读的,则gpfdist服务器从指定目录中的文件读取数据记录, 将它们打包到块中,并在响应Greenplum数据库节点的请求时发送该块。 这些节点解压缩它们接收的行并根据外部表的分发策略分发它们。 如果外部表是可写表,则节点将请求中的行块发送到gpfdist,gpfdist将它们写入外部文件。

外部数据文件可以包含CSV格式的行或CREATE EXTERNAL TABLE命令的FORMAT子句支持的任何分隔文本格式。 此外,gpfdist可以配置YAML格式的文件,以在支持的文本格式和另一种格式(例如XML或JSON)之间转换外部数据文件。 有关如何使用gpfdist将外部XML文件读入Greenplum数据库可读外部表的示例,请参阅<ref>。

对于可读的外部表,gpfdist会自动解压缩gzip.gz)和bzip2.bz2)文件。 您可以使用通配符(*)或其他C样式模式匹配来表示要读取的多个文件。 外部文件路径都假定相对于启动gpfdist实例时指定的路径。

关于gpfdist设置和性能

您可以在多个主机上运行gpfdist实例,也可以在每个主机上运行多个gpfdist实例。 这允许您策略性地部署gpfdist服务器,以便通过利用所有可用的网络带宽和Greenplum数据库的并行性来获得快速的数据加载和卸载速率。

  • 允许网络流量同时使用所有的ETL主机网络接口卡(NIC)。 在ETL主机上运行一个gpfdist实例, 然后在 on the ETL host, then declare the host name of each NIC in the 用户的外部表定义(见Examples for Creating External Tables。)的LOCATION子句中声明每一个NIC的主机名。
Figure 1. 使用带多个NIC的单一gpfdist实例的外部表

  • 在ETL主机上的多个gpfdist实例之间平均划分外部表数据。 例如,在一个有两个NIC的ETL系统上,运行两个gpfdist实例(每个NIC上一个)来优化数据装载性能并且在这两个gpfdist之间平均划分外部表数据文件。
Figure 2. 使用带多个NIC的多个gpfdist实例的外部表

Note: 当用户提交文件给gpfdist时,用竖线(|)来分隔格式化好的文本。 Greenplum数据库将逗号分隔的文本字符串包括在单引号或者双引号中。 gpfdist必须移除这些引号来解析字符串。 使用竖线分隔格式化好的文本避免了这种额外的步骤并且可以改进性能。

控制Segment并行

gp_external_max_segs服务器配置参数控制能同时访问单一gpfdist实例的Segment实例数量。 64是默认值。用户可以设置Segment的数目为一些Segment处理外部数据文件并且一些执行其他数据库处理。 在用户的Master实例的postgresql.conf文件中设置这个参数。

安装gpfdist

gpfdist被装载用户的Greenplum数据库Master主机安装的$GPHOME/bin中。 在一个不同于Greenplum数据库Master或者后备Master的机器上运行gpfdist,例如在专用于ETL处理的机器。 在Master或者后备Master上运行gpfdist可能会对查询执行造成性能影响。 要在用户的ETL服务器上安装gpfdist,请从Greenplum Load Tools包中得到它并且按照它的安装指导。

启动和停止gpfdist

用户可以在用户的当前目录中或者其他指定的任何目录中启动gpfdist。默认端口是8080

从用户的当前目录中运行,输入:

gpfdist &

要从一个不同的目录启动,应指定提供文件的目录,还可以有选择地指定运行的HTTP端口。

要在后台启动gpfdist 并且把输出的消息和错误记录在一个日志文件中:

$ gpfdist -d /var/load_files -p 8081 -l /home/gpadmin/log &

对于同一个ETL主机上的多个gpfdist实例(见Figure 1),为每一个实例使用一个不同的基础目录和端口。例如:

$ gpfdist -d /var/load_files1 -p 8081 -l /home/gpadmin/log1 &
$ gpfdist -d /var/load_files2 -p 8082 -l /home/gpadmin/log2 &

gpfdist运行在后台时停止它:

首先找到它的进程ID:

$ ps -ef | grep gpfdist

然后杀死进程,例如(这个例子中的进程ID是3456):

$ kill 3456

解决gpfdist的问题

Segment在运行时访问gpfdist。 确保Greenplum的Segment主机具有到gpfdist的网络访问。 gpfdist是一个Web服务器:可以通过从Greenplum阵列的每一个主机(Segment和Master)运行下列命令来测试连接:

$ wget http://gpfdist_hostname:port/filename
         

CREATE EXTERNAL TABLE定义必须有用于gpfdist的正确的主机名、端口以及文件名、 以及相对于gpfdist提供文件的目录(gpfdist启动时指定的目录路径)的方式指定文件和路径。 请见Examples for Creating External Tables

如果用户在其系统上启动gpfdist且IPv6网络被禁用,测试一个IPv6端口时,gpfdist会显示下列警告消息。

[WRN gpfdist.c:2050] Creating the socket failed

如果对应的IPv4端口可用,gpfdist会使用该端口并且忽略对于IPv6端口的警告。 要查看gpfdist测试的端口的信息,使用-V选项。

有关IPv6和IPv4网络的信息,请见操作系统的文档。

当用gpfdist或者gfdists协议读写数据时, gpfdist工具拒绝头部不包括X-GP-PROTO的HTTP请求。 如果在头部没有检测到X-GP-PROTOgpfist会在HTTP响应头部的状态行中返回一个400错误: 400 invalid request (no gp-proto)

Greenplum数据库会在HTTP请求头部包括X-GP-PROTO以表示该请求是来自于Greenplum数据库。

如果gpfdist实用程序挂起而没有发生读取或写入活动,则可以在下次发生挂起时生成core文件以帮助调试问题。 将环境变量GPFDIST_WATCHDOG_TIMER设置为gpfdist无活动等待多少秒后强制退出。 设置环境变量并且gpfdist挂起后,实用程序将在指定的秒数后中止,创建core文件,并将中止信息发送到日志文件。

此示例在Linux系统上设置环境变量,以便gpfdist在300秒(5分钟)无活动后退出。
export GPFDIST_WATCHDOG_TIMER=300