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

Posted 流木随风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了: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安装完成后,后续的整个编译流程我们可以分为以下几个步骤:

获取源码-->启动容器-->编译环境配置-->下载三方库文件-->编译三方库-->编译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
___

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

基础篇.ARM架构介绍

ARM架构介绍(1)

本章主要介绍ARM架构通用知识,不仅仅包括ARMv7\\ARMv8/ARMv9


1.ARM体系结构介绍

ARM公司主要向客户提供处理器IP。ARM体系结构是一种硬件规范,主要用来约定指令集、芯片内部体系结构等。以指令集为例,ARM体系结构并没规定每一条指令在硬件IP中如何实现,只是约定了每条指令的格式、行为规范、参数等。

为了降低客户基于ARM体系结构开发处理器(processor 或 core)的难度,ARM公司通常在发布新版本的体系结构之后,根据不同的应用需求开发出兼容该体系结构的处理器(processor 或 core)IP,然后授权给客户。客户获得ARM设计的处理器IP后,基于其定制和设计自己的SOC。

以ARMv8体系结构为例,ARM公司先后开发出Cortex-A53、Cortex-A55、Cortex-A72、Cortex-A73等多款处理器IP。

ARM架构为 processor 或 core的设计提供了基础,通常我们可以将processor 或 core称为Processing Element(PE)。

2.ARM授权模式

ARM公司一般有两种授权方式:

  • 体系结构授权。客户可以根据这个规范自行设计与之兼容的处理器。
  • 处理器IP授权。ARM公司根据某个版本的体系结构来设计处理器,然后把处理器的设计方案授权给客户。

市面上的大部分芯片都是直接采用ARM处理器IP,少部分大厂如高通、TI他们基于ARM 公版IP进行二次开发,而像苹果这样的大佬甚至自己基于ARM架构规范实现自己的处理器IP。

3.架构和微架构

3.1 什么是架构(处理器领域)

其实前面已经有所介绍。在这里,主要指的是处理器的功能规范。 架构指定处理器的行为方式,例如它有什么指令以及指令做什么,而不包括如何做。

架构视为硬件和软件之间的规则。 该架构描述了软件可以依赖硬件提供哪些功能。 一些功能是可选的,我们将在稍后的微架构部分讨论。

架构可能会规定:

3.2 什么是微架构

架构(Architecture)不会告诉您处理器是如何构建和工作的。 处理器的构建和设计被称为微架构。 微架构( micro-architecture)规定了处理器应该如何工作,我们上述提到的”ARM公司根据某个版本的体系结构来设计处理器IP“ 就是微架构,如Cortex-A53 和Cortex-A72 都是基于Armv8-A 架构实现的微架构。

微架构通常包括:

  • 几级Cache和Cache Size大小等。
  • 几级流水线。
  • 每条指令执行的周期。
  • 其他可选供能。

例如,Cortex-A53 和 Cortex-A72 都是 Armv8-A 架构的实现。 这意味着它们具有相同的架构,但它们具有非常不同的微架构,如下图所示

4.Arm 架构和微架构的发展

4.1 Timeline

4.2 产品演进


Arm 架构是最著名的 Arm 规范,但它并不是唯一的规范。现代片上系统 (SoC) 除了Core之外的其他IP同样也遵循一些其他ARM规范。 下图提供了一些示例:

  • Generic Interrupt Controller
  • System Memory Management Unit (SMMU or IOMMU)
  • Generic Timer
  • Server Base System Architecture and Trusted Base System Architecture
  • Advanced Microcontroller Bus Architecture(AMBA)

4.3 ARM产品分类

ARM11芯片之后,也就是从ARMv7架构开始,ARM IP微架构的命名方式有所改变。

新的处理器家族,改以Cortex命名,ARM微架构根据应用场景分为三个系列,分别是Cortex-A,Cortex-R,Cortex-M。

Cortex-A系列(A:Application)

面向性能密集型系统的应用处理器内核。主要针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域,如智能手机、平板电脑、汽车娱乐系统、数字电视,智能本、电子阅读器、家用网络、家用网关和其他各种产品。。

Cortex-R系列 (R:Real-time)
面向实时应用的高性能内核。主要针对需要运行实时操作的系统应用,面向如汽车制动系统、动力传动解决方案、大容量存储控制器等深层嵌入式实时应用。

Cortex-M系列(M:Microcontroller)
面向各类嵌入式应用的微控制器内核。该系列面向微控制器领域,主要针对成本和功耗敏感的应用,如智能测量、人机接口设备、汽车和工业控制系统、家用电器、消费性产品和医疗器械等。

Cortex-SC系列(SC:SecurCore)
其实,除了上述三大系列之外,还有一个主打安全的Cortex-SC系列(SC:SecurCore),主要用于政府安全芯片。

5. Arm 架构文档

  • Arm Architecture Reference Manual (Arm ARMs) - 架构类的文档, 一般就看这个
  • Arm Cortex processor has a Technical Reference Manual (TRM) - arm core的文档, 基本不用看
  • Arm Cortex processor also has a Configuration or Integration Manual (CIM) - 可能是给ASIC看的

例如你要学习 Cortex-A75 processor,可以去查看以下文档:

以上是关于:ARM架构下手动编译StarRocks(拓展篇)的主要内容,如果未能解决你的问题,请参考以下文章

osgearth在arm架构下怎么打开?

基于IMX53(freescale) ARM架构平台, Ubuntu20.xx版本下交叉编译Qt4.8.7

基于IMX53(freescale) ARM架构平台, Ubuntu20.xx版本下交叉编译Qt4.8.7

基于MIPS ARM架构平台, Ubuntu20.xx版本下交叉编译Qt5.12.xtslib-1.4

基于MIPS ARM架构平台, Ubuntu20.xx版本下交叉编译Qt5.12.xtslib-1.4

Burst 编译器,让Arm 架构中的Unity 项目性能最大化