开源 Greenplum:从外部表中选择时 GPFDIST 错误“分段错误”

Posted

技术标签:

【中文标题】开源 Greenplum:从外部表中选择时 GPFDIST 错误“分段错误”【英文标题】:Open Source Greenplum: GPFDIST error 'Segmentation fault' when selecting from external table 【发布时间】:2019-04-17 10:29:41 【问题描述】:

我正在尝试简单地设置一个开源 Greenplum 实例,并且几天来一直在遇到关于 GPFDIST 的相同问题!简而言之,我在 CentOS 7.6 上从头开始进行完整安装(如果需要,可以提供有关设置的更多详细信息)安装 OS GPDB 软件版本 5.18 并禁用 GPORCA。编译的完整命令是:

./configure --prefix=/usr/local/gpdb --with-perl --with-python --with-libxml --with-gssapi --with-includes=/usr/local/gpdb/include --with-libs=/usr/local/gpdb/lib --disable-orca

这样编译成功,下面的make/make install 命令太完整了,没有问题。 Greenplum 数据库本身的初始化也成功了,然后我可以进入数据库并像往常一样创建表、插入数据和运行查询。

但如果我尝试从外部表中进行选择,例如:

create external table test_external_table
(testing smallint
)
location ('gpfdist://mdw:8080/test_data.csv')
format 'csv' (header delimiter '|')
;

使用 GPFDIST 运行如下:

gpfdist -d /home/gpadmin/test/ -p 8080 -l /home/gpadmin/greenplum/logs/gpfdist_log 2>&1 &

然后我得到两个错误;一个来自外部表,一个来自 GPFDIST。它们如下:

External Table Returns:
ERROR:  connection with gpfdist failed for gpfdist://mdw:8080/test_data.csv. effective url: http://127.0.0.1:8080/test_data.csv. error code = 104 (Connection reset by peer)  (seg0 slice1 127.0.0.1:6000 pid=27962)

GPFDIST Returns:
[1]+  Segmentation fault      gpfdist -d /home/gpadmin/test -p 8080 -l /home/gpadmin/greenplum/logs/gpfdist_log 2>&1

我已经删除了 OS GPDB GitHub 安装指南中没有的所有内容(用于“基本”设置),所以我认为这不会导致问题。我已经尝试了与主机名和网络防火墙有关的一切,就我所见,一切都很完美。

我还从 Pivotal 下载了相同版本的 GPDB (5.18),并同时在同一实例上安装了该版本,GPFDIST 运行良好。

我还尝试过 OS GPDB 5.17、6 beta 和 7 beta,但我都遇到了同样的问题。

非常感谢任何关于可能导致此问题的想法,因为我现在正慢慢地想弄清楚这一点。

非常感谢您的任何帮助。

-- 编辑--

好吧.. 在尝试在 CentOS 7 上安装 debuginfo 的东西时,我几乎把自己的胳膊咬断了,我终于用 gdb 生成了一个核心转储。然后我运行:

gdb -c core_dump.<pid>

并得到以下输出:

Core was generated by `gpfdist -d /home/gpadmin/test -p 8080 -l /home/gpadmin/greenplum/logs/gpfdist_log'.
Program terminated with signal 11, Segmentation fault.
#0  0x00007f4f2c07bdff in ?? ()

但我完全不知道这意味着什么......老实说,我现在对此有点过头了,真的不知道如何继续。

【问题讨论】:

您是否禁用了所有防火墙? 127.0.0.1 上的对等点重置连接是我跳出来的错误。 是的,它们已被禁用。而且,如前所述,我能够在同一个实例上安装官方 Pivotal GPDB 5.18 并从那里使用 GPFDIST,它使用相同的端口等(它本质上是相同的命令) - 这就是为什么我有点难住了。 目录中的每个文件都会发生这种情况,还是只是特定文件?即使使用简单的外部表和简单的文件,您也能重现问题吗?您还可以使用--enable-debug 构建吗?然后 gdb 就会知道错误发生在哪里... 【参考方案1】:

peer 重置的连接仅表明套接字的另一端已断开(...在这种情况下,gpfdist 因为它崩溃了)。

设置您的 gpfdist 并尝试将 wget 添加到托管文件:

--header='X-GP-PROTO:0'

您需要添加标头以避免请求被拒绝。

你能在那里检索文件吗?或者这也会崩溃?

如果崩溃了,这与数据库无关 - 您可能需要核心转储来确定段错误是什么(读/写权限、内存等)。

【讨论】:

我完全可以检索文件。并且已经完成了各种其他网络任务,例如系统更新和从远程网络从一台主机到另一台主机的 SCP 传输 - 没有问题。如何进行核心转储?目前不在工作,但我明天会考虑这样做,看看它是否有助于找到任何可能对我“隐藏”的东西。 您可以将操作系统配置为在崩溃时转储——检查您对核心转储大小的限制,看看它是否被禁用。【参考方案2】:

我终于设法解决了这个问题。如果有人遇到类似问题,请确保您安装的是 Libevent 版本 1.4[.15],并且没有高于此版本。

我安装了 2.2.0,虽然 Greenplum 认为这很好,但它实际上并不适用。不幸的是,我确实必须从头开始安装整个系统才能让它正常工作,因为仅仅在已经编译过 Greenplum 的旧系统上安装 Libevent 1.4 对我来说不起作用。

【讨论】:

以上是关于开源 Greenplum:从外部表中选择时 GPFDIST 错误“分段错误”的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum:获取通过外部表处理的文件名

将数据插入 Greenplum 物理表

用于导入数据的 Greenplum windows 服务

从Greenplum上的表中读取数据时,如何在Spark-jdbc应用程序的选项“dbtable”中指定子查询? [复制]

将csv文件导入greenplum外部表时如何转义换行符?

greenplum使用gplink连接外部数据源