以下文章来源于Apache Doris 补习班 ,作者苏奕嘉
[
Apache Doris 补习班 .
Apache Doris Active Contributor 和 SelectDB SA 来做的不定时更新,主打 Apache Doris 系列学习文章和相关信息、原理解析或者新特性使用教程,争取 All In 原创,欢迎投稿~
](#)
教程已在视频号与B站同步更新,可点击文末 原文链接 跳转至B站
3.1.1. 编译目的和工作流程简述
编译目的
在 Apache Doris 项目中,从 1.0 版本开始,社区提供了 x86 架构和 arm 架构的二进制压缩包,所谓二进制压缩包,即是将编译好的可运行文件打为压缩包的形式。
若如果没有二次开发和源码学习诉求,只是学习产品本身或在测试、生产环境中搭建集群,则用户无需再二次编译二进制包,直接前往 Apache Doris 官网或者 SelectDB 官网下载二进制包解压缩即可使用。
Apache Doris 官网或者 SelectDB 官网提供的二进制版本,是经过社区流水线及 SelectDB 回归测试线检测的 Release 版本,相较于用户自己拉取任意分支,或者修改部分代码后编译的版本,稳定性和可靠性要强很多,故此,若仅为使用产品本身,请直接下载官方二进制包部署使用即可。
综上,编译的目的就是为了将编程语言转化为机器语言,整个流程简图如下图所示。
工作流程
Apache Doris 有两个主进程 —— Frontend 和 Backend,即 FE [前端] 和 BE [后端]。FE 是由 Java 语言编写的进程,BE 是由 C++ 语言编写的进程,故而两者编译方式是有差异的。但在 Apache Doris 社区的努力下,编译工作的流程极大程度被简化,当前使用 Shell 脚本命令即可取代繁杂的人工编译流程,故而底层的具体区别实现在此不过多阐述。
接下来我们共同了解一下,在整个编译过程中,作为 Apache Doris 用户,应当有哪些工作流程以及注意事项。
1. 选择编译平台
Apache Doris 当前可满足在 CPU 为 x86、arm 两种架构上,或基于这两个基础架构进行魔改的架构(apple、海光、申威等)上进行编译运行,故此首要任务是选择一个未来运行平台的 CPU 架构,因为在不同 CPU 架构下,编译使用的指令集也不同,如在 arm 架构机器上编译以后的二进制文件,将无法在 x86 机器上正常运行。
2. 构建编译环境
编译需要关注两部分内容,第一部分是 Apache Doris 软件本身所依赖的各类三方运行环境和编译环境,第二部分是编译使用的系统是否具备 Apache Doris 构建时所需的动态链接库等系统级环境。同时运行时是什么系统,强烈建议编译时就用什么系统,如此可以尽可能减少编译与运行环境带来的差异而导致的各类异常。
3. 拉取源码编译
将准备好的源码包拉取或解压缩至指定目录下,使用官方提供的编译脚本进行编译。建议使用 git 进行代码拉取,拉取后的源码将自动修改 version 等信息,若采用 Download 方式下载 Zip 后解压缩进行编译,则可能导致编译以后的版本号变为 0.0.0-unknow,不利于后续的使用和维护。
4. 检查编译结果
编译以后的二进制文件,需要关注编译以后的版本号以及 commit 号是否与编译使用的源码包一致,同时需拷贝一份进行单机启动部署,使用常规建表语句、导入语句、查询语句等功能进行校验,若未有异常问题,则表名该编译过程已顺利结束。
综上所述,Apache Doris 的编译过程需要分为四步顺次进行。其中确定需要的架构平台,以及选择与运行环境相同的编译系统是非常重要一部分。
3.1.2. 编译实操与说明
编译实操部分,将按步骤详细描述如何操作,同时简要说明不同架构和系统下的编译注意事项。
3.1.2.1. CPU 架构与适配系统简述
CPU 架构简述
中央处理器 [CPU] 是在冯·诺依曼计算机体系下的控制核心和计算核心,CPU 芯片的优劣对一台机器的性能影响非常明显。而在当前主流的 x86 和 ARM 架构下,又衍生出了众多的魔改芯片,如苹果公司当前自研的 Apple M 系列芯片,就是 ARM 架构的同构产品。
国内诸多国产化芯片,如海光芯片、鲲鹏芯片、申威芯片、飞腾芯片、龙芯芯片等,也都是基于上述两种主流架构同构的产品。虽然主架构一致,但在处理器与指令集方面,具备大同小异的产品特性,在编译过程中,‘大同小异’中的‘小异’往往会给上层应用带来很多适配性的工作,若没有做指令集的兼容,往往在编译时会出现各种异常导致编译失败,故此确定不同的 CPU 架构对软件编译而言十分重要。
最后需要注意的是 x86 的 CPU 在适配 Apache Doris 上会有两种类型,一种是支持 avx2 指令集的 CPU,一种是不支持的,Apache Doris 从 1.1 版本开始全面实现的向量化就是基于 avx2 指令集来实现的,所以在后续过程中该小项也将是我们关注点之一。
适配系统简述
当前主流的 PC 操作系统有三类,在个人使用范畴内应用最多的是微软 Windows 系统,其次是苹果闭源生态的 MacOS,最后是运行在绝大多数服务器上的 Linux 内核系统。
Apache Doris 定位是一款企业级实时数据仓库软件,故而主要的应用运行环境为 Linux 内核系统,当前对 Linux 内核系统适配度非常高。
其次是 MacOS 系统,因为诸多的开发者都有使用 MacOS 进行开发的诉求,社区也因此做了对 MacOS & Apple-M 的编译适配工作。
Windows 系统基本不具备 Apache Doris 的工作环境,故此暂未支持基于 Windows 原生系统的编译工作,但基于 Windows 11 版本的 WSL2 沙盒环境或者 VM 虚拟机环境,使用 Linux 内核系统做编译环境也可完成 Apache Doris 的编译工作。
不同 CPU 架构对 Apache Doris 的影响
x86 架构的 CPU 往往在单核性能上要优于 ARM 架构的 CPU,同时 x86 架构的向量化指令集的成熟度和生态完整度也要优于 ARM 架构。而 ARM 架构虽然在单核性能上不如 x86 架构,但 ARM 架构单一 CPU 的核心数要远多于 x86 架构,所以 ARM 架构可以使用大规模的 CPU 并发查询来弥补单核性能不足这个问题。
同时社区也做了很多 ARM 架构指令集适配的工作,加之 Apache Doris 后续的 Pipeline 引擎等软件层面的优化手段,等价位下 x86 机器与 ARM 机器的性能差异大概在 20-30%。
所以无论是哪种 CPU 架构,Apache Doris 都有比较好的应用适配能力和稳定运行能力。
编译环境建议
在 Apache Doris 1.x 系列及 2.x 系列,都建议使用 JDK 8(Java Development Kit 8) 进行编译,编译平台架构视运行环境而定,编译系统推荐 Ubuntu 22.04 系统。
综上,在编译 Apache Doris 时应注意后续程序的运行环境的 CPU 架构,同时若无特殊系统需求,建议采用推荐的编译环境进行编译,以此减少编译问题的发生。
可通过使用以下命令确定当前机器为哪种 CPU 架构:
cat /proc/cpuinfo
3.1.2.2. Docker 编译
Docker 编译介绍
Docker 编译方式即为拉取预制好的 Docker Image 镜像,构建本地编译环境。Apache Doris 社区从 0.15 版本开始已提供不同细分版本的 Docker Compose Image,所以如果没有定制化的诉求,可以直接至 apache/doris DockerHub 仓库下拉取相应版本的编译环境镜像,根据编译步骤依次完成编译。
那很多同学会比较好奇官方镜像里到底包有什么东西?下图可简单阐述。
所以综上所述,Apache Doris 社区将每次需要重复造的轮子通过 Docker Iamge 这种形式打包好交由用户直接使用,其中免去了很多复杂的编译环境构建工作量,同时也尽可能将每个版本适配的 thirdparty 三方库编译好的二进制目录直接构建在了镜像中,如此便可进一步节省 Apache Doris 进程的编译时间。
Apache Doris Docker Compose Image 内置了上图中下方实框内除去源码的其他部分,所以使用 Docker 构建方式,只需要拉取源码构建镜像即可进行编译。
环境要求
Docker 本身就是为了屏蔽底层环境带来的异常,所以当前只要 Docker 可以正常运行的 x86 或者 ARM 架构的机器以及相关系统,都可以通过这类方式进行编译,如用虚拟机或者 WSL2 也可以完成。
在编译过程中,为了编译可以顺利进行,请满足以下硬件资源要求:
资源名称
最低配置
推荐配置
CPU
1C
4C
内存
8G
16G
磁盘
20G
100G
编译步骤
以 Apache Doris 2.0.2-rc05 编译为例
1.拉取指定版本的 Docker Compose Image
docker pull apache/doris:build-env-for-2.0
2.构建 Docker 编译容器
docker run \
-itd \
-v /your/local/.m2:/root/.m2 \
-v /your/local/apache-doris:/opt/apache-doris \
--name doris-build \
apache/doris:build-env-for-2.0
3.拉取指定版本的 Apache Doris Source
# 进入 docker 容器
docker exec -it doris-build bash
# git 拉取源码切换分支
git clone http://github.com/apache/doris.git && cd ./doris
git fetch origin --tags && git checkout 2.0.2-rc05
4.校验是否支持 AVX2 指令集
cat /proc/cpuinfo | grep avx2
5.执行编译命令
- • 支持 AVX2 与 ARM 版本编译
sh build.sh
- • 不支持 AVX2 编译
USE_AVX2=0 sh build.sh
6.编译完成后进行校验
- • 校验版本号
- • 创建副本构建 1FE + 1BE 的单机集群进行验证
- • 校验无误打包命名
常见问题
- 1. 编译异常,观察错误信息为三方依赖库报错,可删除在镜像中路径为 /var/local/thirdparty/installed 的文件夹,将源码包中 thirdparty 目录内容复制至上述目录中,重新进行编译,该方式可重新编译三方库然后再进行 Apache Doris 进程编译。
- 2. FE 依赖下载过慢,可编辑 /usr/share/maven/conf/settings.xml 配置文件,查找 mirrors 数据源,添加阿里云 mirror,重新编译。
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
3.1.2.3. LDB-toolchain 编译
LDB-toolchain 编译介绍
LDB 编译方式时直接在 x86 或者 ARM 的机器上构建 Apache Doris 的编译环境,前一篇 Docker 编译的方式我们介绍了在 Docker 里做了哪些事情来节省编译时候的工作,而整个 Docker 的 C++ 编译环境 clang 和 gcc 的构建,实则也是由 LDB-toolchain 来构建的,具体的目录在 Docker 容器内 /var/local/ldb\_toolchain 目录下。
除去 C++ 的编译环境外,我们还需要其他的编译基本组件,如 JDK、Maven、NodeJS 等等一系列环境,这些需要我们手动安装部署,所有涉及组件将在编译步骤中提及,不过多赘述。
LDB-toolchain 工具是由 Apache Doris 社区 Amos Bird 同学贡献的,可将整体的 C++ 编译运行环境打包为二进制包来进行随布随编,极大提升了 Apache Doris 的编译工作便捷性。
当前 Apache Doris 使用 LDB-toolchain 工具时,推荐使用 0.17 版本,其中包含了 clang-16 和 gcc-11。
环境要求
同 Docker 编译,除去软件版本要求以外,物理硬件资源建议如下。
编译系统使用 CentOS 7.6,CPU 架构使用 x86 架构。
资源名称
最低配置
推荐配置
CPU
1C
4C
内存
8G
16G
磁盘
20G
100G
编译步骤
以 Apache Doris 2.0.2-rc05 编译为例
1.下载 LDB-toolchain 工具包
wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.17/ldb_toolchain_gen.sh
2.运行构建 LDB 编译环境
# 创建并指定安装部署目录为 /opt/software/ldb_toolchain/
mkdir -p /opt/software && cd /opt/software
sh ldb_toolchain_gen.sh /opt/software/ldb_toolchain/
# 其中 /opt/software/ldb_toolchain/ 为安装 toolchain 目录。
3.下载及部署 JDK、Maven、NodeJS 环境
# 下载压缩包
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u131-linux-x64.tar.gz
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/apache-maven-3.6.3-bin.tar.gz
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v12.13.0-linux-x64.tar.gz
# 解压缩完成安装部署
tar -zxvf jdk-8u131-linux-x64.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz
tar -zxvf node-v12.13.0-linux-x64.tar.gz
4.设置环境变量
vi /etc/profile.d/doris-compose.sh
# 以下内容写入文件
export JAVA_HOME=/opt/software/jdk1.8.0_131
export MAVEN_HOME=/opt/software/apache-maven-3.6.3
export NODE_JS_HOME=/opt/software/node-v12.13.0-linux-x64
export LDB_HOME=/opt/software/ldb_toolchain
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$NODE_JS_HOME/bin:$LDB_HOME/bin:$PATH
# 保存退出,重新加载环境变量使其生效
source /etc/profile.d/doris-compose.sh
5.安装其他必须环境
# 安装系统编译环境
yum install -y byacc patch automake libtool make which file ncurses-devel gettext-devel unzip bzip2 zip util-linux wget git python2
# 安装 autoconf-2.69
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
tar zxf autoconf-2.69.tar.gz && \
cd autoconf-2.69 && \
./configure && \
make && \
make install
# 安装 bison-3.0.4
wget http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz && \
tar xzf bison-3.0.4.tar.gz && \
cd bison-3.0.4 && \
./configure && \
make && \
make install
6.拉取 Apache Doris 源码并切换分支
cd /opt/
# git 拉取源码切换分支
git clone http://github.com/apache/doris.git && cd ./doris
git fetch origin --tags && git checkout 2.0.2-rc05
7.校验是否支持 AVX2 指令集
cat /proc/cpuinfo | grep avx2
8.执行编译命令
- • 支持 AVX2 与 ARM 版本编译
sh build.sh
- • 不支持 AVX2 编译
USE_AVX2=0 sh build.sh
9.编译完成后进行校验
- • 校验版本号
- • 创建副本构建 1FE + 1BE 的单机集群进行验证
- • 校验无误打包命名
常见问题
- 1. 报错 gcc 或者 clang 版本过低,或者其他组件版本过低,需要升级或者重新编译其他组件。
- 2. 配置环境变量未生效,导致编译时获取错误的软件版本,需要确认环境变量配置。
3.1.2.4. 裸机编译
裸机编译介绍
不推荐!
裸机编译即为使用完全裸机的环境,从零部署编译环境,再拉取源码完成编译。
该方式编译非常不便且耗时极长,尤其 gcc 环境与 clang 环境与内核适配升级的过程风险很大,故此本文不将此编译做以赘述。
如有实际需求,可前往 Apache Doris 官网编译部署章节(https://doris.apache.org/zh-C...)作为参考。
3.1.3. 编译小结
该篇我们主要介绍了在 Apache Doris 编译过程中,整个编译过程的目的和需要完成的具体工作流程,同时也介绍了不同架构 CPU 及指令集对 Apache Doris 的影响和对编译过程的影响,同时介绍和较详细的阐述了两种主流编译方式的编译思路、编译步骤以及编译问题等知识。
接下来我们将进入部署阶段,学习使用不同的部署方式完成学习环境、开发环境、测试环境以及生产环境的集群搭建,从下一篇开始,将正式使用 Apache Doris 实时数据仓库。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。