StarRocks已经完整的适配了ARM架构的服务器,目前官网提供的部署包是基于x86架构编译的,我们可以使用StarRocks的源码手动编译适用于ARM架构的二进制部署包。
为了保证文档的通用性,我们使用Docker拉取CentOS 7.9的镜像来配置编译环境。下文中的编译操作适用于StarRocks2.0及以上版本,理论上在RedHat系的系统中通用,也推荐使用红帽系的系统进行编译(Ubuntu系的几个系统在测试编译过程中出现过几个玄学报错,我暂时没有思路)。
首先需要说明的是,由于ARM还未支持SIMD指令集,StarRocks的向量化只能用上少部分的能力,所以较x86架构,部分场景性能可能会有较大的差异。
其次,国产Linux操作系统在构建内核时可能未启用部分相关内核配置选项,所以Docker在个别系统中可能无法正常安装运行。这里建议使用Moby项目中提供的检测脚本来判断当前系统内核是否支持安装Docker:
moby/check-config.sh at master · moby/moby · GitHubMoby Project - a collaborative project for the container ecosystem to assemble container-based systems - moby/check-config.sh at master · moby/mobyhttps://github.com/moby/moby/blob/master/contrib/check-config.sh
执行检测:
root@liumu-L420-KLVV-W5821:~# chmod a+x check-config.sh
root@liumu-L420-KLVV-W5821:~# ./check-config.sh
其中的Generally Necessary项需要全部支持才可正常安装Docker。不同操作系统下Docker安装操作不太一致,这里先行省略。
编译ARM下可用的部署包必需在ARM架构的机器下进行,本次使用华为擎云L420笔记本,搭载华为Kirin 9006C八核ARM处理器(从参数看应该是华为手机使用的麒麟9000处理器的改造版),操作系统使用的是基于Ubuntu的“银河麒麟桌面操作系统V10(SP1)”。
Docker安装完成后,后续的整个编译流程我们可以分为以下几个步骤:
获取源码-->启动容器-->编译环境配置-->下载三方库文件-->编译三方库-->编译StarRocks。
编译用到的部分环境依赖、三方库和maven库已上传至度盘(单击即可访问),编译好的包暂不提供。
StarRocks的代码我们可以从github上获取,地址为:
Tags · StarRocks/starrocks · GitHubStarRocks is a next-gen sub-second MPP database for full analytics scenarios, including multi-dimensional analytics, real-time analytics and ad-hoc query. - Tags · StarRocks/starrockshttps://github.com/StarRocks/starrocks/tags
或者每日同步一次的gitee库:
StarRocks 标签 - Gitee.comhttps://gitee.com/mirrors/StarRocks/tags
目前StarRocks维护中的版本有2.0 LTS版、2.1稳定版、以及带有新特性快速迭代的2.2和2.3版。其中,2.0版本所用的三方库openssl-1.0.2k版在ARM下有bug需要修改openssl的几行代码,见文章末尾的“附录一:ARM下2.0版本编译注意事项”。2.1版本的2.1.6-2.1.10在代码中有一个指令集判断的小问题,这个已经在2.1.11中修复了。本次演示使用StarRocks 2.1.11进行编译,我们将下载好的代码解压分发至/opt/starrocks备用:
root@liumu-L420-KLVV-W5821:/opt/starrocks# pwd
/opt/starrocks
1、拉取CentOS 7.9系统镜像:
root@liumu-L420-KLVV-W5821:~# docker pull centos:centos7.9.2009
2、挂载本地源码目录和maven依赖目录启动容器:
root@liumu-L420-KLVV-W5821:~# docker run -it -v /root/.m2:/root/.m2 -v /opt/starrocks:/root/starrocks --name starrocks-arm --privileged=true -d centos:centos7.9.2009
3、进入容器,后面所有操作都是基于容器中的CentOS系统进行:
root@liumu-L420-KLVV-W5821:~# docker exec -it starrocks-arm /bin/bash
StarRocks需使用gcc 10.3进行编译,我们使用devtoolset快速配置编译环境:
[root@6d8737b3b403 ~]# yum install centos-release-scl -y
[root@6d8737b3b403 ~]# yum install devtoolset-10 -y
[root@6d8737b3b403 ~]# ln -sf /opt/rh/devtoolset-10/root/bin/* /usr/bin/
使用yum安装编译过程中需要的依赖:
[root@6d8737b3b403 ~]# yum install -y epel-release
[root@6d8737b3b403 ~]# yum install -y ccache python3 bzip2 wget git libstdc++-static byacc flex automake libtool binutils-devel bison ncurses-devel make mlocate unzip patch which vim-common redhat-lsb-core zip libcurl-devel updatedb
此外,编译过程还需要使用JDK8、CMAKE和MAVEN,我们手动部署在/opt/module/目录下:
[root@6d8737b3b403 module]# pwd
/opt/module
[root@6d8737b3b403 module]# ll
total 12
drwxr-xr-x 6 root root 4096 Jun 13 03:17 apache-maven-3.6.3
drwxr-xr-x 6 root root 4096 Jun 13 03:17 cmake-3.22.2-linux-aarch64
drwxr-xr-x 8 root root 4096 Jun 28 06:23 jdk1.8.0_333
JDK我们需要使用JDK8(下载时需要登录Oracle帐户):
https://www.oracle.com/java/technologies/downloads/#java8
CMAKE地址:
https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-aarch64.tar.gz
MAVEN地址:
https://apache.osuosl.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
完成后在profile中配置环境变量:
[root@6d8737b3b403 module]# vi /etc/profile
export JAVA_HOME=/opt/module/jdk1.8.0_333
export PATH=$PATH:$JAVA_HOME/bin
export CMAKE_HOME=/opt/module/cmake-3.22.2-linux-aarch64
export PATH=$PATH:$CMAKE_HOME/bin
export MAVEN_HOME=/opt/module/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
export STARROCKS_GCC_HOME=/opt/rh/devtoolset-10/root/usr
export PATH=$PATH:$STARROCKS_GCC_HOME/bin
最后的STARROCKS_GCC_HOME是为了编译时指向正确的GCC 10脚本路径,配置后执行source命令让环境变量生效:
[root@6d8737b3b403 module]# source /etc/profile
依赖版本检查:
[root@6d8737b3b403 ~]# gcc –v
Using built-in specs.
…………
gcc version 10.2.1 20210130 (Red Hat 10.2.1-11) (GCC)
[root@6d8737b3b403 ~]# g++ -v
Using built-in specs.
COLLECT_GCC=g++
…………
gcc version 10.2.1 20210130 (Red Hat 10.2.1-11) (GCC)
[root@6d8737b3b403 ~]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /opt/module/apache-maven-3.6.3
Java version: 1.8.0_333, vendor: Oracle Corporation, runtime: /opt/module/jdk1.8.0_333/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "5.4.96-4-kr9a0", arch: "aarch64", family: "unix"
[root@6d8737b3b403 ~]# java -version
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)
[root@6d8737b3b403 ~]# cmake -version
cmake version 3.22.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
三方库可以认为是StarRocks BE的依赖,StarRocks各个大版本使用的三方库版本也可能是不同的,我们切换到源码的thirdparty目录:
[root@6d8737b3b403 ~]# cd starrocks/thirdparty/
执行download-thirdparty.sh脚本,获取三方库文件到本地(部分三方库可能需要科学上网,获取过程中会显示下有链接,若遇到网络问题无法直接下载的,可以手动下载后拷贝到当前脚本目录下的src目录中):
[root@6d8737b3b403 thirdparty]# ./download-thirdparty.sh
执行完成后,所有三方库文件会检验后保存在src目录中并自动解压。src目录的三方库文件有:
CRoaring-0.2.60.tar.gz
aliyun-oss-sdk-3.7.2.tar.gz
arrow-apache-arrow-5.0.0.tar.gz
bisheng-jdk-8u262-linux-aarch64.tar.gz
bitshuffle-0.3.5.tar.gz
boost_1_75_0.tar.gz
breakpad-d6a6f52606529111b9f0ade9a0e0d9040fa97c1f.zip
brotli-1.0.9.tar.gz
bzip2-1.0.8.tar.gz
cctz-2.3.tar.gz
curl-7.79.0.tar.gz
flatbuffers-v1.10.0.tar.gz
fmt-7.0.3.zip
gflags-2.2.2.tar.gz
glog-0.4.0.tar.gz
googletest-release-1.10.0.tar.gz
gperftools-2.7.tar.gz
hadoop-3.3.0-aarch64.tar.gz
hyperscan-5.3.0.aarch64.tar.gz
incubator-brpc-0.9.7.tar.gz
jemalloc-5.2.1.tar.bz2
leveldb-1.20.tar.gz
libevent-24236aed01798303745470e6c498bf606e88724a.zip
librdkafka-1.7.0.tar.gz
lz4-1.9.3.tar.gz
mariadb-connector-c-3.1.14.tar.gz
openssl-OpenSSL_1_1_1m.tar.gz
protobuf-3.14.0.tar.gz
ragel-6.10.tar.gz
rapidjson-1.1.0.tar.gz
re2-2017-05-01.tar.gz
rocksdb-6.22.1.zip
ryu-aa31ca9361d21b1a00ee054aac49c87d07e74abc.zip
s2geometry-0.9.0.tar.gz
simdjson-v1.0.2.tar.gz
snappy-1.1.8.tar.gz
thrift-0.13.0.tar.gz
zlib-1.2.11.tar.gz
zstd-1.5.0.tar.gz
执行build-thirdparty.sh脚本编译上一步获取到的三方库代码:
[root@6d8737b3b403 thirdparty]# ./build-thirdparty.sh
三方库编译的过程无需联网,但会花费不短的时间(在这台擎云笔记本上耗时约半小时)。正常来说按照文档规范操作不会报错,若确实出现问题,首先看报错的是哪个三方库,排查解决后在build-thirdparty.sh脚本最后部分注释掉已编译成功的库名称,这样可以直接继续编译未完成的三方库。再或者,直接清空当前目录下的installed文件夹,从头编译。
当看到提示:Finihsed to build all thirdparties,就表示三方库全部编译完成,我们就可以开始编译StarRocks的编译了。
前面所有的准备工作就绪后,我们正式开始StarRocks的编译。还是先解释一点,StarRocks的版本号不是写在代码里,而是在编译前通过配置环境变量打进来的,若不配置环境变量,我们编译好的包的版本号就是大写的UNKNOWN了。执行export命令配置版本,例如:
[root@6d8737b3b403 ~]# export STARROCKS_VERSION="2.1.11-AArch64-LM"
切换目录到源码主目录,执行编译:
[root@6d8737b3b403 starrocks]# pwd
/root/starrocks
[root@6d8737b3b403 starrocks]# ./build.sh
StarRocks的编译也会花费不短的时间,本次演示在我本地有FE maven库的情况下也花费了约1个小时。
整个编译过程是先编译BE,再自动编译FE。BE的三方库依赖在上一步我们已经准备完成了,BE编译完成后我们会看到如下图的提示:
FE是使用Java语言编写的,编译过程中会下载不少的依赖jar包,这个过程正常是需要联网的,若网络不稳定就可能报错,我们可以根据报错提示手动下载jar包拷贝到本地maven仓库的对应路径中解决。
在第二步启动Docker容器时,我们挂载了本地的.m2目录,这样FE编译过程中需要的依赖就也会在本地保留,后续再编译时就省去了依赖下载的时间。
排除网络问题,StarRocks的编译过程正常来说不会报错,若确实由于某些状况报错了,再次执行编译命令时建议执行一下清理,完整的命令写法为:
./build.sh --fe --be --spark-dpp --clean
FE编译完成后会提示StarRocks编译成功:Successfully build StarRocks
编译完成后,产出的二进制包在output目录中:
[root@6d8737b3b403 output]# pwd
/root/starrocks/output
[root@6d8737b3b403 output]# ll
total 2004
-rw-r--r-- 1 root root 3858 Jul 11 10:33 LICENSE.txt
-rw-r--r-- 1 root root 2032796 Jul 12 07:36 NOTICE.txt
drwxr-xr-x 6 root root 4096 Jul 12 07:36 be
drwxr-xr-x 7 root root 4096 Jul 12 07:36 fe
drwxr-xr-x 4 root root 4096 Jul 12 07:36 udf
我们知道StarRocks严格来说只有两类进程,就是咱们通过build.sh脚本前面编译的FE和BE,为了和Hadoop生态通信,StarRocks引入了Broker组件,这个组件需要我们单独进行编译。
切换至Broker代码目录:
[root@6d8737b3b403 starrocks]# cd fs_brokers/apache_hdfs_broker/
执行编译:
[root@6d8737b3b403 apache_hdfs_broker]# ./build.sh
Broker也是使用Java语言开发的,需要下载maven依赖,Broker的编译几分钟就完成了:
编译产出的二进制包也存放在目录下的output中:
[root@6d8737b3b403 output]# pwd
/root/starrocks/fs_brokers/apache_hdfs_broker/output
[root@6d8737b3b403 output]# ll
total 4
drwxr-xr-x 5 root root 4096 Jul 12 07:45 apache_hdfs_broker
习惯性的,我会将Broker拷贝至StarRocks的主程序包中:
[root@6d8737b3b403 output]# cp -r /root/starrocks/fs_brokers/apache_hdfs_broker/output/apache_hdfs_broker/ /root/starrocks/output/
[root@6d8737b3b403 output]# cd /root/starrocks/output/
[root@6d8737b3b403 output]# ll
total 2008
-rw-r--r-- 1 root root 3858 Jul 11 10:33 LICENSE.txt
-rw-r--r-- 1 root root 2032796 Jul 12 07:36 NOTICE.txt
drwxr-xr-x 5 root root 4096 Jul 12 07:53 apache_hdfs_broker
drwxr-xr-x 6 root root 4096 Jul 12 07:36 be
drwxr-xr-x 7 root root 4096 Jul 12 07:36 fe
drwxr-xr-x 4 root root 4096 Jul 12 07:36 udf
至此,StarRocks的手动编译操作整个完成,我们使用这份部署包正常部署测试即可。StarRocks我们推荐部署在CentOS 7的系统上,因为官方针对该系统的测试最为充分。其他主流的Linux系统我个人测试运行也是没什么问题的,若大家的场景需要可以自行测试,有问题也欢迎在git上提issue反馈。
附录一:ARM下编译StarRocks 2.0版本的注意事项
2.0版本编译时,在完成第四步未进行第五步前,我们需要修改openssl-1.0.2k的几行代码:
cd thirdparty/src/openssl-1.0.2k
修改文件sha1-armv8.pl:
vi crypto/sha/asm/sha1-armv8.pl
添加:
.extern OPENSSL_armcap_P
.hidden OPENSSL_armcap_P
删除:
.comm OPENSSL_armcap_P,4,4
修改文件sha512-armv8.pl:
vi crypto/sha/asm/sha512-armv8.pl
添加:
.extern OPENSSL_armcap_P
.hidden OPENSSL_armcap_P
删除:
$code.=<<___;
.comm OPENSSL_armcap_P,4,4
___
修改保存后即可进行三方库编译。