ARM 平台编译 Apache Doris
本文介绍如何在 ARM64 平台上编译 Apache Doris,包括硬件/操作系统兼容性、依赖安装与编译流程。
该文档仅作为指导性文档。不同 ARM 环境下编译可能出现其他错误,欢迎在 doris-website Issues 中反馈或提交解决方案。
从 3.0.3 版本开始,ARM 平台支持存算分离模式的编译部署。
1. 硬件与操作系统兼容性
以下环境已经过社区验证:
| 操作系统 | 版本 | CPU 示例 |
|---|---|---|
| KylinOS | Kylin-Server-10-SP1-Release-Build04-20200711 | Phytium FT-2000+/64 |
| CentOS | 7.9 及以上(AltArch) | aarch64 |
| Ubuntu | 20.04 | aarch64 |
参考输出:
# KylinOS
$ cat /etc/.kyinfo
name=Kylin-Server
milestone=10-SP1-Release-Build04-20200711
arch=arm64
beta=False
time=2020-07-11 17:16:54
dist_id=Kylin-Server-10-SP1-Release-Build04-20200711-arm64-2020-07-11 17:16:54
$ cat /proc/cpuinfo
model name : Phytium,FT-2000+/64
# CentOS 7.9
$ lsb_release -a
LSB Version: :core-4.1-aarch64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.9.2009 (AltArch)
Release: 7.9.2009
Codename: AltArch
2. 软件环境配置
2.1 依赖版本对照表(以 JDK 8 为例)
| 组件 | 版本 | 备注 |
|---|---|---|
| Git | 2.0+ | |
| JDK | 1.8.0 | 编译 3.0+ 或 master 需 JDK 17 |
| Maven | 3.6.3 | 推荐 3.9.9 |
| NodeJS | 16.3.0 | |
| LDB Toolchain | 0.9.1 | ARM 推荐 0.21+ |
| autoconf | 2.69 | 源码编译安装 |
| bison | 3.0.4 | |
| 常备系统包 | yum/apt 自动安装 | byacc、patch、automake、libtool、make、which、file、ncurses-devel、gettext-devel、unzip、bzip2、zip、util-linux、wget、git、python2 |
2.2 软件环境安装命令
- CentOS 7.9
- Ubuntu 20.04
- 创建软件下载安装包根目录和软件安装根目录
# 创建软件下载安装包根目录
mkdir /opt/tools
# 创建软件安装根目录
mkdir /opt/software
- 安装依赖项
- Git
# 省去编译麻烦,直接使用 yum 安装
yum install -y git
- JDK 8
# 编译 Doris 2.1 及更早版本时,可以安装 JDK 8
# 方式一:直接使用 yum 安装,devel 包用于提供 jps 等工具
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# 方式二:下载 arm64 架构安装包,解压后配置环境变量
cd /opt/tools
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u291-linux-aarch64.tar.gz && \
tar -zxvf jdk-8u291-linux-aarch64.tar.gz && \
mv jdk1.8.0_291 /opt/software/jdk8
- JDK 17
# 编译 Doris 3.0(含)之后的版本或 master 分支,需要将 JDK 8 换成 JDK 17
yum install -y java-17-openjdk java-17-openjdk-devel
- Maven
cd /opt/tools
# 下载后直接解压配置环境变量
wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz && \
tar -zxvf apache-maven-3.9.9-bin.tar.gz && \
mv apache-maven-3.9.9 /opt/software/maven
- NodeJS
cd /opt/tools
# 下载 arm64 架构安装包
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v16.3.0-linux-arm64.tar.xz && \
tar -xvf node-v16.3.0-linux-arm64.tar.xz && \
mv node-v16.3.0-linux-arm64 /opt/software/nodejs
- LDB Toolchain
cd /opt/tools
# 下载 LDB Toolchain ARM 版本
wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.21/ldb_toolchain_gen.aarch64.sh && \
sh ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/
- 配置环境变量
# 配置环境变量(以 JDK 8 为例)
vim /etc/profile.d/doris.sh
export JAVA_HOME=/opt/software/jdk8
export MAVEN_HOME=/opt/software/maven
export NODE_JS_HOME=/opt/software/nodejs
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.sh
# 验证安装结果(以 JDK 8 为例)
java -version
> java version "1.8.0_291"
mvn -version
> Apache Maven 3.9.9
node --version
> v16.3.0
gcc --version
> gcc-11
- 安装其他额外环境和组件
# 安装常备系统包
sudo yum install -y byacc patch automake libtool make which file ncurses-devel gettext-devel unzip bzip2 bison zip util-linux wget git python2
# 安装 autoconf-2.69
cd /opt/tools
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
tar zxf autoconf-2.69.tar.gz && \
mv autoconf-2.69 /opt/software/autoconf && \
cd /opt/software/autoconf && \
./configure && \
make && \
make install
- 更新 apt 软件源
apt-get update
- 检查 shell 命令集
Ubuntu 默认 /bin/sh 指向 dash 而非 bash,需要切换成 bash 才能执行部分脚本。先查看当前 sh 指向:
ls -al /bin/sh
可通过下面命令切换:
sudo dpkg-reconfigure dash
在交互界面选择 no(不将 dash 设为默认 shell),即可让 /bin/sh 指向 bash。
- 创建软件下载安装包根目录和软件安装根目录
# 创建软件下载安装包根目录
mkdir /opt/tools
# 创建软件安装根目录
mkdir /opt/software
- 安装依赖项
- Git
# 直接使用 apt-get 安装
apt-get -y install git
- JDK 8
# 下载 arm64 架构安装包,解压后配置环境变量
cd /opt/tools
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u291-linux-aarch64.tar.gz && \
tar -zxvf jdk-8u291-linux-aarch64.tar.gz && \
mv jdk1.8.0_291 /opt/software/jdk8
- JDK 17
# 编译 Doris 3.0(含)之后的版本或 master 分支,需要将 JDK 8 换成 JDK 17
apt-get -y install openjdk-17-jdk
- Maven
cd /opt/tools
# 下载后直接解压配置环境变量
wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz && \
tar -zxvf apache-maven-3.9.9-bin.tar.gz && \
mv apache-maven-3.9.9 /opt/software/maven
- NodeJS
cd /opt/tools
# 下载 arm64 架构安装包
wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v16.3.0-linux-arm64.tar.xz && \
tar -xvf node-v16.3.0-linux-arm64.tar.xz && \
mv node-v16.3.0-linux-arm64 /opt/software/nodejs
- LDB Toolchain
cd /opt/tools
# 下载 LDB Toolchain ARM 版本
wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.21/ldb_toolchain_gen.aarch64.sh && \
sh ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/
- 配置环境变量
# 配置环境变量(以 JDK 8 为例)
vim /etc/profile.d/doris.sh
export JAVA_HOME=/opt/software/jdk8
export MAVEN_HOME=/opt/software/maven
export NODE_JS_HOME=/opt/software/nodejs
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.sh
# 验证安装结果(以 JDK 8 为例)
java -version
> java version "1.8.0_291"
mvn -version
> Apache Maven 3.9.9
node --version
> v16.3.0
gcc --version
> gcc-11
- 安装其他额外环境和组件
# 安装常备系统包
sudo apt install -y build-essential cmake flex automake bison binutils-dev libiberty-dev zip libncurses5-dev curl ninja-build
sudo apt-get install -y make
sudo apt-get install -y unzip
sudo apt-get install -y python2
sudo apt-get install -y byacc
sudo apt-get install -y automake
sudo apt-get install -y libtool
sudo apt-get install -y bzip2
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa
sudo apt update
sudo apt install gcc-11 g++-11
sudo apt-get -y install autoconf autopoint
# 安装 autoconf-2.69
cd /opt/tools
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
tar zxf autoconf-2.69.tar.gz && \
mv autoconf-2.69 /opt/software/autoconf && \
cd /opt/software/autoconf && \
./configure && \
make && \
make install
3. 编译
ARM 平台目前仅推荐使用 LDB Toolchain 进行编译。该方法适用于 commit 7f3564 之后的 Doris 版本。
LDB Toolchain 的下载和安装详见上文,之后的编译方式请参阅 使用 LDB Toolchain 编译。其中 JDK 与 NodeJS 需替换为 aarch64 版本(详见上文)。
如果下载预编译三方库遇到问题,请使用 tools/build_thirdparty.sh 自行编译。编译三方库时请使用 gcc:
export DORIS_TOOLCHAIN=gcc
在 ARM 平台编译 Doris 时,必须关闭 AVX2、LIBUNWIND、AZURE 三方库:
export USE_AVX2=OFF
export USE_UNWIND=OFF
export DISABLE_BUILD_AZURE=ON
如在编译、启动时仍遇到问题,请查阅 常见问题。如果没有相关解决方案,欢迎 提出 issue。
4. 常见问题
4.1 编译问题
1. 编译第三方库 libhdfs3.a,找不到文件夹
-
问题描述:
在执行编译安装过程中出现报错:
not found lib/libhdfs3.a file or directory
-
问题原因:
第三方库依赖下载失败。
-
解决方案:
使用第三方下载仓库重新编译三方库。
export REPOSITORY_URL=https://doris-thirdparty-repo.bj.bcebos.com/thirdparty
sh /opt/doris/thirdparty/build-thirdparty.sh
REPOSITORY_URL 中包含所有第三方库源码包和它们的历史版本。
2. python 命令未找到
-
问题描述:
执行
build.sh时抛出异常:/opt/doris/env.sh: line 46: python: command not found
Python 2.7.18
-
问题原因:
系统默认使用
python2.7、python3.6、python2、python3这几个命令调用 Python,但 Doris 依赖要求存在名为python的命令(2.7+ 即可)。 -
解决方案:
建立
/usr/bin/python的软链接。
# 查看 python 安装目录
whereis python
# 建立软链接
sudo ln -s /usr/bin/python2.7 /usr/bin/python
3. 编译结束后没有 output 目录
-
问题描述:
build.sh执行结束后,目录中未发现output文件夹。 -
问题原因:
未成功编译,需重新编译。
-
解决方案:
sh build.sh --clean
4. spark-dpp 编译失败
-
问题描述:
执行
build.sh编译到 spark-dpp 时报错:Failed to execute goal on project spark-dpp
-
问题原因:
Maven 中央仓库
repo.maven.apache.org不可达,无法下载依赖:Could not transfer artifact org.apache.spark:spark-sql_2.12:jar:2.4.6 from/to central (https://repo.maven.apache.org/maven2): Transfer failed for https://repo.maven.apache.org/maven2/org/apache/spark/spark-sql_2.12/2.4.6/spark-sql_2.12-2.4.6.jar: Unknown host repo.maven.apache.org
-
解决方案:
检查网络后重新 build。
5. 剩余空间不足,编译失败
-
问题描述:
编译过程中报构建 CXX 对象失败,提示剩余空间不足:
fatal error: error writing to /tmp/ccKn4nPK.s: No space left on device
1112 | } // namespace doris::vectorized
compilation terminated.
-
问题原因:
设备剩余空间不足。
-
解决方案:
扩大设备剩余空间,如删除不需要的文件等。
6. 在 pkg.config 中找不到 pkg.m4 文件
-
问题描述:
编译过程中出现找不到文件错误:
Couldn't find pkg.m4 from pkg-config. Install the appropriate package for your distribution or set ACLOCAL_PATH to the directory containing pkg.m4.
通过日志可见是
libxml2三方库编译时出错。 -
问题原因:
libxml2三方库编译过程中检索不到pkg.m4文件。可能由于:- Ubuntu 系统加载环境变量时有异常,导致 ldb 目录下的索引未被成功加载
- 在 libxml2 编译时检索环境变量失效,导致编译过程没有检索到
ldb/aclocal目录
-
解决方案:
将
ldb/aclocal目录下的pkg.m4文件拷贝至libxml2/m4目录下,重新编译三方库:
cp /opt/software/ldb_toolchain/share/aclocal/pkg.m4 /opt/doris/thirdparty/src/libxml2-v2.9.10/m4
sh /opt/doris/thirdparty/build-thirdparty.sh
7. 执行测试 CURL_HAS_TLS_PROXY 失败
-
问题描述:
三方包编译过程报错:
-- Performing Test CURL_HAS_TLS_PROXY - Failed
CMake Error at cmake/dependencies.cmake:15 (get_property):
INTERFACE_LIBRARY targets may only have whitelisted properties. The property "LINK_LIBRARIES_ALL" is not allowed.
查看日志后发现是 curl 头文件找不到:
fatal error: curl/curl.h: No such file or directory
2 | #include <curl/curl.h>
compilation terminated.
ninja: build stopped: subcommand failed.
-
问题原因:
编译走了系统自带的 gcc 9.3.0,而非 LDB Toolchain。需正确配置 LDB Toolchain 环境变量。
-
解决方案:
配置 LDB 环境变量:
# 配置环境变量
vim /etc/profile.d/ldb.sh
export LDB_HOME=/opt/software/ldb_toolchain
export PATH=$LDB_HOME/bin:$PATH
# 保存退出并刷新环境变量
source /etc/profile.d/ldb.sh
# 测试
gcc --version
> gcc-11
8. 编译过程中止,提示 ninja failed with: signal: killed
-
问题描述:
BE 或三方库在编译中途失败,提示字样包含:
ninja failed with: signal: killed
-
问题原因:
所在机器内存不足。
-
解决方案:
换用更大内存(至少 16 GB)的机器进行编译,或者减小编译并发度(
-j)。
4.2 启动问题
1. 启动 FE 失败,事务 -20 问题
-
问题描述:
在启动 FE 时,报事务错误 20 问题,状态为 UNKNOWN:
[BDBEnvironment.setup():198] error to open replicated environment. will exit.
com.sleepycat.je.rep.ReplicaWriteException: (JE 18.3.12) Problem closing transaction 20. The current state is:UNKNOWN. The node transitioned to this state at:Fri Apr 22 12:48:08 CST 2022
-
问题原因:
硬盘空间不足。
-
解决方案:
释放硬盘空间或者挂载新硬盘。
2. BDB 环境设置异常,磁盘寻找错误
-
问题描述:
在迁移 FE 所在的盘符后启动 FE 报异常:
2022-04-22 16:21:44,092 ERROR (MASTER 172.28.7.231_9010_1650606822109(-1)|1) [BDBJEJournal.open():306] catch an exception when setup bdb environment. will exit.
com.sleepycat.je.DiskLimitException: (JE 18.3.12) Disk usage is not within je.maxDisk or je.freeDisk limits and write operations are prohibited: maxDiskLimit=0 freeDiskLimit=5,368,709,120 adjustedMaxDiskLimit=0 maxDiskOverage=0 freeDiskShortage=1,536,552,960 diskFreeSpace=3,832,156,160 availableLogSize=-1,536,552,960 totalLogSize=4,665 activeLogSize=4,665 reservedLogSize=0 protectedLogSize=0 protectedLogSizeMap=
-
问题原因:
迁移了 FE 所在的位置,元数据存储的硬盘信息无法匹配,或者硬盘损坏或未挂载。
-
解决方案:
- 检查硬盘是否正常、是否初始化并正确挂载
- 修复 FE 元数据
- 测试环境可以删除元数据目录重新启动
3. BE 启动时 coredump,core 栈中可见 libc.so 或 glibc-compatibility/ 字样
-
问题原因:
当前机器 glibc 版本过低。可通过
ldd --version确认,如果版本低于 2.27 则可能发生这一问题。 -
解决方案:
重新编译 BE,编译时增加环境变量:
export GLIBC_COMPATIBILITY=OFF
4.3 其他组件问题
-
问题描述
如有以下组件的错误提示,统一以下述方案处理:
- bison 相关:安装 bison-3.0.4 时报 fseterr.c 错误
- flex 相关:flex 命令未找到
- cmake 相关:cmake 命令未找到 / cmake 找不到依赖库 / cmake 找不到 CMAKE_ROOT / cmake 环境变量 CXX 中找不到编译器集
- boost 相关:Boost.Build 构建引擎失败
- mysql 相关:找不到 mysql 客户端依赖 a 文件
- gcc 相关:GCC 版本需 11+
-
问题原因
未使用正确的 LDB Toolchain 进行编译。
-
解决方案
- 检查 LDB Toolchain 环境变量是否配置
- 查看 gcc 版本是否与 使用 LDB Toolchain 编译 文档中推荐一致
- 删除
ldb_toolchain_gen.aarch64.sh脚本执行后的 ldb 目录,重新执行并配置环境变量,验证 gcc 版本