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。
获得更多关于Greenpum的技术干货,请访问Greenplum中文社区网站。