研究背景
相关项目人员因业务特点,需要在本地GP集群中使用PXF读取其他GP集群的表数据。
测试数据
使用标准TPCH工具生成300G数据,并导入远端GP集群(以下称为集群1)
数据生成/导入步骤:
- 使用dbgen产生一些测试数据, -s 表示scale(单位为GB),根据需要测试的数据量指定:
./dbgen -s 300 -f
- 将测试数据转换为postgresql识别的格式,删除末尾的分隔符|。
for i in `ls *.tbl`; do sed 's/|$//' $i > ${i/tbl/csv}; done
- 使用dss路径下的SQL脚本创建表并导入数据
PXF配置
使用的PXF版本为5.14.0,由于目前没有连接GP的专属配置,故在本地GP集群(以下称为集群2)使用连接postgresql 的JDBC协议去连接集群1的master节点。
PXF配置过程:
- 修改.bash_profile
将以下内容添加到.bash_profile中,保存退出后,执行该文件。
PXF_CONF=$HOME/greenplum-pxf
export PXF_CONF
- 在数据库中创建pxf extension
database-name=# CREATE EXTENSION pxf;
- 在.bashrc中配置JAVA_HOME
可以使用以下命令查找JAVA_HOME
java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home'
每个节点都需要配置,并且路径需要相同。(如果实际路径不同可以考虑使用软连接)
- 配置JDBC xml文件
在$PXF_CONF/servers路径下创建新路径jdbc-test,将$PXF_CONF/templates/jdbc-site.xml拷贝到$PXF_CONF/servers/jdbc-test下。修改其中参数如下:
- 同步到其他数据库节点
pxf cluster sync
pxf cluster stop
pxf cluster start
- 建立PXF协议外部表后,即可查询
注意:使用JDBC协议的外部表进行查询时,会连接本地数据库,并且连接地址是localhost:5432。如果本地数据库的master节点端口不是5432,则会报错。目前并未找到可以配置本地端口的地方。查看pxf源码后,在java代码中有默认端口5432,但是首先会寻找$PGPORT。在环境中已经配置了$PGPORT为其他端口的情况下还是会连接localhost:5432报错,目前还未找到原因,只能通过部署时指定端口为5432解决。
测试1
原计划测试TPCH所有的22条SQL语句,由于第一条语句执行完后就有着很大性能差异,故只研究第一条SQL(1.sql)执行情况。
- sql内容
说明:该SQL只涉及lineitem表,lineitem表总行数1799989091,1.sql中where条件过滤后的行数为1787132296。
集群1执行情况:
执行时间:1192259.789 ms (20min)
集群2执行情况:
上图中椭圆框是我加入的内容。根据执行计划看,External Scan的确只扫描了过滤后的行,但是时间过长,占据了执行的大部分时间。使用sar工具监控网络流量,在External Scan期间,网络接收速度稳定在3800 rxkB/s左右,计算接收的数据大约在67G。
注:生成lineitem.csv时,文件大小约为220G,导入到数据库中的lineitem表大小为296G,本次扫描过滤的行数为总行数的99.3%。
测试2
在上一步测试中,由于在集群2中查询的时间大部分消耗在External Scan,故修改1.sql,将where条件过滤后的行数降低。
- sql内容(修改)
说明:该SQL只修改了where条件后的语句,1.sql(修改)后的where条件过滤后的行数为18656,约为总行数的0.001%。
集群1执行情况:
执行时间:195238.412 ms
集群2执行情况:
执行时间:196321.784 ms
可以看出在过滤了绝大部分行数后,集群1与集群2的执行时间几乎相同。
网络传输分析
在测试1中,External Scan阶段时的网络接受速度稳定在3800 rxkB/s左右,并持续了约5个小时,直至External Scan结束。为测试网速上限,从集群1节点上scp一个压缩包至集群2节点。传输时,集群2的网络接收速度稳定在约120000 rxkB/s,这与集群上配置的千兆交换机相符。
在集群1节点上创建大量小文件,将其scp至集群2节点,发现集群2的网络接收速度大幅降低。当小文件在2KB左右时,网络接收速度与External Scan时相近。
执行分析
本次测试的SQL包含order by子句,在external scan的过程中,数据库的2个节点都存在网络的收发与磁盘的写入,并且在segment节点的base路径下存在pgsql_tmp路径,其中包含名称类似为pgsql_tmp_Sort_1_278098.0的文件,共在3个segment下发现此类文件(共4个primary segment),大小分别约为41G,21G,21G。这与执行计划中的“Sort Method: external sort Disk: 62445760kB”与“ort Method: external merge Disk: 21377408kB”相符合。
总结
- GP集群间使用PXF连接时,只有master之间存在数据传输,查询时需要将过滤后(需要开启谓词下推)的数据通过其中一个集群的master节点传输至另一个集群的master节点
- External Scan阶段传输的可能是大量小文件,导致传输速度过慢,无法发挥交换机的最大性能
- 当External Scan阶段的数据较大,sort阶段会写磁盘,导致性能降低
- 根据GP厂家解释,目前GP集群之间没有并行连接的工具,计划未来会推出