Greenplum 带ORCA 优化器的编译安装解析

ORCA是开源的Postgres和Greenplum的优化器,相比于Greenplum和Postgres内置的优化器,ORCA在复杂查询以及分区表等场合有非常好的性能提升。这里介绍下如何使Greenplum启用ORCA优化器,以及如何运行Greenplum的测试用例installcheck-world。


设置开发环境


在开始之前需要装编译和运行的依赖,包括Greenplum和ORCA的依赖。这里采用的编译环境以CentOS 7为例。首先安装系统包,执行的命令如下:


sudo yum -y groupinstall "Development Tools"
sudo yum -y install readline-devel zlib-devel curl-devel apr-devel libevent-devel libxml2-devel bzip2-devel python-devel openssl-devel which iproute net-tools perl-Env wget
sudo yum install -y epel-release centos-release-scl
sudo yum install -y python-pip python-psutil cmake3
sudo yum install -y devtoolset-6-toolchain
sudo yum install -y xerces-c-devel


Greenplum源码保包中的README.CentOS.bash有相关的依赖包设置,这里的命令相比README.CentOS.bash增加了部分依赖。接下来按装相关的python依赖,命令如下:


sudo pip install --upgrade pip
sudo pip install --no-cache-dir lockfile paramiko setuptools psutil conan


然后安装ORCA依赖的编译管理公共ninja,这里用的是1.8.2版本。最新的1.9 依赖了高版本的c++运行库,在CentOS7上执行会报错。


wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip
unzip ninja-linux.zip
sudo mv ninja /usr/local/bin/


最后再来配置额外的环境设置:


sudo mkdir /usr/local/gpdb
sudo chown -R whoami /usr/local/gpdb source scl_source enable devtoolset-6 sudo ln -sf /usr/bin/cmake3 /usr/bin/cmake


到此我们的准备工作就全部完成,可以开始编译了。


配置ORCA


准备xerces依赖库(可选)


编译ORCA之前需要先编译它的依赖,也就是xerces,ORCA用它来读写xml数据格式。这一步操作是可选的,因为我们既可以使用已经安装好的系统版本,也可以使用带gp补丁的版本(地址为:https://github.com/greenplum-db/gp-xerces)。如果要使用gp补丁的版本,需要执行的命令如下:


git clone https://github.com/greenplum-db/gp-xerces.git
cd gp-xerces/
mkdir build && cd build
../configure --prefix=/usr/local/gpdb
make && make install && make install


编译ORCA


编译ORCA需要cmake3和gcc-6,在第一步中已经配置完成,开始前可通过如下命令进行确认:


gcc --version
cmake --version


如果版本不对或者命令没有找到,请确保如下两个操作正确执行了:


source scl_source enable devtoolset-6
sudo ln -sf /usr/bin/cmake3 /usr/bin/cmake


其中命令source scl_source enable devtoolset-6用于修改gcc版本,可将其加入登录脚本中来自动执行


echo 'source scl_source enable devtoolset-6' >> ~/.bashrc


由于Greenplum和ORCA之间存在版本匹配问题,因此我们采用的方式是用Greenplum源码中的ORCA版本来编译,具体步骤如下:


git clone https://github.com/greenplum-db/gpdb.git --branch 6X_STABLE --single-branch --depth 1 -b 6X_STABLE 6X_STABLE
cd 6X_STABLE/depends
CFLAGS="-L/usr/local/gpdb/lib/" ./configure --prefix=/usr/local/gpdb
make
make install_local


此时编好ORCA就被安装于/usr/local/gpdb目录下了。


编译Greenplum


Greenplum有很多的扩展功能可以在命令行里控制,这里重点在编译ORCA,因此使用的配置关掉其它一些编译参数。在Greenplum的源码根目录执行如下命令:


export LD_LIBRARY_PATH=/usr/local/gpdb/libCFLAGS="-I/usr/local/gpdb/include" LDFLAGS="-L/usr/local/gpdb/lib/" ./configure --enable-orca --without-perl --without-python --with-libxml --without-gssapi --disable-pxf --without-zstd -without-openssl
make -j4 && make install


当命令执行成功后,恭喜你,你自己的Greenplum已经就绪。编译好的Greenplum就被安装到/usr/local/gpdb目录,它可以作为一个整体打包,部署到其它机器的同样位置进行集群测试。编译好的gpdb目录内容大致如下:


$ ls /usr/local/gpdb
bin  docs  etc  greenplum_path.sh  include  lib  sbin  share


运行测试用例


Greenplum编译完之后,我们需要确认所有的相关测试可以正常运行。Greenplum继承了Postgres的测试框架,提供了自己的测试target:installcheck-world。此外,Greenplum还包含了创建测试集群的配置,因此我们的目标就是用测试集群来执行installcheck-world测试。


准备系统配置


为确保测试可以正常执行,强烈建议根据Greenplum官方文档来配置相应的系统配置文件,包括/etc/security/limits.conf和/etc/sysctl.conf等,在源码目录的README.linux.md中也有简单的描述。


此外,由于即使单机版本,Greenplum也需要使用SSH执行命令,因此需要配置好无密码访问:


ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys


创建测试集群


通过如下命令可以创建一个3 primary, 3 mirror的Greenplum集群:


source /usr/local/gpdb/greenplum_path.sh
make create-demo-cluster


当看到如下信息时,说明demo集群配置成功。


 optimizer
----------- 
 on 
(1 row)
                gp_opt_version
---------------------------------------------- 
GPOPT version: 3.48.0, Xerces version: 3.1.2(1 row)


如果出现错误,需要根据提示进行相应的修复。修复完后,可以先通过命令


pkill postgres


来强制结束未完成的操作,然后重新执行。


执行测试


创建好测试集群后,就可以运行测试了,在Greenplum源码根目录下执行如下命令:


PGPORT=15432 make installcheck-world


所有测试都会在打开ORCA的情况下执行。此外,尽管我们使用的是STABLE分支,仍有可能出现某些测试失败的情况,欢迎大家提供补丁或者上报bug。


本文作者:李阳,Pivotal中国研发中心Greenplum研发部产品经理,有丰富的Postgres和Greenplum的实战及开发经验。参与过多个Greenplum重要组件的开发及产品设计,包括大数据平台容器化技术,ETL解决方案,流式数据处理,数据库灾备等。目前负责Greenplum的新一代ETL和流处理引擎Greenplum Stream Server。


关注微信公众号

VMware 中国研发中心