第6.3章:ARM架构下手动编译StarRocks(拓展篇)

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安装完成后,后续的整个编译流程我们可以分为以下几个步骤:

扫描二维码关注公众号,回复: 14697229 查看本文章

获取源码-->启动容器-->编译环境配置-->下载三方库文件-->编译三方库-->编译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的编译。还是先解释一点,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
___

修改保存后即可进行三方库编译。

猜你喜欢

转载自blog.csdn.net/ult_me/article/details/125746656