Apache Doris Arm 架构编译

本文档介绍如何在 ARM64 平台上编译 Doris。

注意,该文档仅作为指导性文档。在不同环境中编译可能出现其他错误。如遇问题,欢迎向 Doris 提出issue 或解决方案。

硬件/操作系统环境

本章内容在以下环境中已经验证可行:

  1. KylinOS:
  1. $> cat /etc/.kyinfo
  2. name=Kylin-Server
  3. milestone=10-SP1-Release-Build04-20200711
  4. arch=arm64
  5. beta=False
  6. time=2020-07-11 17:16:54
  7. dist_id=Kylin-Server-10-SP1-Release-Build04-20200711-arm64-2020-07-11 17:16:54
  8. $> cat /proc/cpuinfo
  9. model name : Phytium,FT-2000+/64
  1. CentOS 7.9 及以上
  1. $> lsb_release -a
  2. LSB Version: :core-4.1-aarch64:core-4.1-noarch
  3. Distributor ID: CentOS
  4. Description: CentOS Linux release 7.9.2009 (AltArch)
  5. Release: 7.9.2009
  6. Codename: AltArch
  1. Ubuntu 20.04

软件环境配置

软件环境对照表

组件名称组件版本
Git2.0+
JDK1.8.0
Maven3.6.3
NodeJS16.3.0
LDB-Toolchain0.9.1
常备环境:
byacc
patch
automake
libtool
make
which
file
ncurses-devel
gettext-devel
unzip
bzip2
zip
util-linux
wget
git
python2
yum或apt自动安装即可
autoconf2.69
bison3.0.4

软件环境安装命令

  • CentOS 7.9
  • Ubuntu 20.04
  1. 创建软件下载安装包根目录和软件安装根目录
  1. # 创建软件下载安装包根目录
  2. mkdir /opt/tools
  3. # 创建软件安装根目录
  4. mkdir /opt/software
  1. 安装依赖项
  • Git
  1. # 省去编译麻烦,直接使用 yum 安装
  2. yum install -y git
  • JDK8
  1. # 两种方式,第一种是省去额外下载和配置,直接使用 yum 安装,安装 devel 包是为了获取一些工具,如 jps 命令
  2. yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
  3. # 第二种是下载 arm64 架构的安装包,解压配置环境变量后使用
  4. cd /opt/tools
  5. wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u291-linux-aarch64.tar.gz && \
  6. tar -zxvf jdk-8u291-linux-aarch64.tar.gz && \
  7. mv jdk1.8.0_291 /opt/software/jdk8
  • Maven
  1. cd /opt/tools
  2. # wget 工具下载后,直接解压缩配置环境变量使用
  3. wget https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz && \
  4. tar -zxvf apache-maven-3.6.3-bin.tar.gz && \
  5. mv apache-maven-3.6.3 /opt/software/maven
  • NodeJS
  1. cd /opt/tools
  2. # 下载 arm64 架构的安装包
  3. wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v16.3.0-linux-arm64.tar.xz && \
  4. tar -xvf node-v16.3.0-linux-arm64.tar.xz && \
  5. mv node-v16.3.0-linux-arm64 /opt/software/nodejs
  • LDB-Toolchain
  1. cd /opt/tools
  2. # 下载 LDB-Toolchain ARM 版本
  3. wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.9.1/ldb_toolchain_gen.aarch64.sh && \
  4. sh ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/
  1. 配置环境变量
  1. # 配置环境变量
  2. vim /etc/profile.d/doris.sh
  3. export JAVA_HOME=/opt/software/jdk8
  4. export MAVEN_HOME=/opt/software/maven
  5. export NODE_JS_HOME=/opt/software/nodejs
  6. export LDB_HOME=/opt/software/ldb_toolchain
  7. export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$NODE_JS_HOME/bin:$LDB_HOME/bin:$PATH
  8. # 保存退出并刷新环境变量
  9. source /etc/profile.d/doris.sh
  10. # 测试是否成功
  11. java -version
  12. > java version "1.8.0_291"
  13. mvn -version
  14. > Apache Maven 3.6.3
  15. node --version
  16. > v16.3.0
  17. gcc --version
  18. > gcc-11
  1. 安装其他额外环境和组件
  1. # Install required system packages
  2. sudo yum install -y byacc patch automake libtool make which file ncurses-devel gettext-devel unzip bzip2 bison zip util-linux wget git python2
  3. # Install autoconf-2.69
  4. cd /opt/tools
  5. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
  6. tar zxf autoconf-2.69.tar.gz && \
  7. mv autoconf-2.69 /opt/software/autoconf && \
  8. cd /opt/software/autoconf && \
  9. ./configure && \
  10. make && \
  11. make install
  1. 更新 apt-get 软件库
  1. apt-get update
  1. 检查 shell 命令集

    ubuntu 的 shell 默认安装的是 dash,而不是 bash,要切换成 bash 才能执行,运行以下命令查看 sh 的详细信息,确认 shell 对应的程序是哪个:

  1. ls -al /bin/sh

通过以下方式可以使 shell 切换回 dash:

  1. sudo dpkg-reconfigure dash

然后选择 no 或者 否 并确认。这样做将重新配置 dash,并使其不作为默认的 shell 工具

  1. 创建软件下载安装包根目录和软件安装根目录
  1. # 创建软件下载安装包根目录
  2. mkdir /opt/tools
  3. # 创建软件安装根目录
  4. mkdir /opt/software
  1. 安装依赖项
  • Git
  1. # 省去编译麻烦,直接使用 apt-get 安装
  2. apt-get -y install git
  • JDK8
  1. # 下载 arm64 架构的安装包,解压配置环境变量后使用
  2. cd /opt/tools
  3. wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u291-linux-aarch64.tar.gz && \
  4. tar -zxvf jdk-8u291-linux-aarch64.tar.gz && \
  5. mv jdk1.8.0_291 /opt/software/jdk8
  • Maven
  1. cd /opt/tools
  2. # wget 工具下载后,直接解压缩配置环境变量使用
  3. wget https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz && \
  4. tar -zxvf apache-maven-3.6.3-bin.tar.gz && \
  5. mv apache-maven-3.6.3 /opt/software/maven
  • NodeJS
  1. cd /opt/tools
  2. # 下载 arm64 架构的安装包
  3. wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v16.3.0-linux-arm64.tar.xz && \
  4. tar -xvf node-v16.3.0-linux-arm64.tar.xz && \
  5. mv node-v16.3.0-linux-arm64 /opt/software/nodejs
  • LDB-Toolchain
  1. cd /opt/tools
  2. # 下载 LDB-Toolchain ARM 版本
  3. wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.9.1/ldb_toolchain_gen.aarch64.sh && \
  4. sh ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/
  1. 配置环境变量
  1. # 配置环境变量
  2. vim /etc/profile.d/doris.sh
  3. export JAVA_HOME=/opt/software/jdk8
  4. export MAVEN_HOME=/opt/software/maven
  5. export NODE_JS_HOME=/opt/software/nodejs
  6. export LDB_HOME=/opt/software/ldb_toolchain
  7. export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$NODE_JS_HOME/bin:$LDB_HOME/bin:$PATH
  8. # 保存退出并刷新环境变量
  9. source /etc/profile.d/doris.sh
  10. # 测试是否成功
  11. java -version
  12. > java version "1.8.0_291"
  13. mvn -version
  14. > Apache Maven 3.6.3
  15. node --version
  16. > v16.3.0
  17. gcc --version
  18. > gcc-11
  1. 安装其他额外环境和组件
  1. # Install required system packages
  2. sudo apt install -y build-essential cmake flex automake bison binutils-dev libiberty-dev zip libncurses5-dev curl ninja-build
  3. sudo apt-get install -y make
  4. sudo apt-get install -y unzip
  5. sudo apt-get install -y python2
  6. sudo apt-get install -y byacc
  7. sudo apt-get install -y automake
  8. sudo apt-get install -y libtool
  9. sudo apt-get install -y bzip2
  10. sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa
  11. sudo apt update
  12. sudo apt install gcc-11 g++-11
  13. sudo apt-get -y install autoconf autopoint
  14. # Install autoconf-2.69
  15. cd /opt/tools
  16. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
  17. tar zxf autoconf-2.69.tar.gz && \
  18. mv autoconf-2.69 /opt/software/autoconf && \
  19. cd /opt/software/autoconf && \
  20. ./configure && \
  21. make && \
  22. make install

编译

在 Arm 平台上编译 - 图1提示

目前 ARM 环境仅推荐使用 ldb-toolchain 进行编译,该方法适用于 commit 7f3564 之后的 Doris 版本。

下载 ldb_toolchain_gen.aarch64.sh

之后的编译方式参阅 使用 LDB toolchain 编译

其中,jdk 和 nodejs 替换为对应的 aarch64 版本:

  1. Java8-aarch64
  2. Node v16.3.0-aarch64

如下载预编译的三方库遇到问题,请使用tools/build_thirdparty.sh自行编译。在编译三方库时,请使用 gcc:

  1. export DORIS_TOOLCHAIN=gcc

在 ARM 平台编译 Doris 时,请关闭 AVX2 和 LIBUNWIND 三方库

  1. export USE_AVX2=OFF
  2. export USE_UNWIND=OFF

如在编译、启动时仍遇到问题,请查阅常见问题。如果没有相关解决方案,欢迎提出issue

常见问题

编译问题

  1. 编译第三方库 libhdfs3.a ,找不到文件夹

    • 问题描述

      在执行编译安装过程中,出现了如下报错

      not found lib/libhdfs3.a file or directory

    • 问题原因

      第三方库的依赖下载有问题

    • 解决方案

      • 使用第三方下载仓库
  1. export REPOSITORY_URL=https://doris-thirdparty-repo.bj.bcebos.com/thirdparty
  2. sh /opt/doris/thirdparty/build-thirdparty.sh

REPOSITORY_URL 中包含所有第三方库源码包和他们的历史版本。

  1. python 命令未找到

    • 问题描述

      • 执行 build.sh 时抛出异常

        /opt/doris/env.sh: line 46: python: command not found

        Python 2.7.18

    • 问题原因

      经查找,发现该系统默认使用 python2.7python3.6python2python3 这几个命令来执行 python 命令,Doris安装依赖需要 python 2.7+ 版本即可,故只需要添加名为 python 的命令连接即可,使用版本2和版本3的都可以

    • 解决方案

      建立 \usr\binpython 命令的软连接

  1. # 查看python安装目录
  2. whereis python
  3. # 建立软连接
  4. sudo ln -s /usr/bin/python2.7 /usr/bin/python
  1. 编译结束后没有 output 目录

    • 问题描述

      • build.sh 执行结束后,目录中未发现 output 文件夹.
    • 问题原因

      未成功编译,需重新编译

    • 解决方案

  1. sh build.sh --clean
  1. spark-dpp 编译失败

  2. 剩余空间不足,编译失败

    • 问题描述

      • 编译过程中报 构建 CXX 对象失败,提示剩余空间不足

        fatal error: error writing to /tmp/ccKn4nPK.s: No space left on device

        1112 | } // namespace doris::vectorized

        compilation terminated.

    • 问题原因

      设备剩余空间不足

    • 解决方案

      扩大设备剩余空间,如删除不需要的文件等

  3. 在 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 文件

      可能的错误:

      1. Ubuntu 系统加载环境变量时有异常,导致 ldb 目录下的索引未被成功加载
      2. 在 libxml2 编译时检索环境变量失效,导致编译过程没有检索到 ldb/aclocal 目录
    • 解决方案

      将 ldb/aclocal 目录下的 pkg.m4 文件拷贝至 libxml2/m4 目录下,重新编译第三方库

  1. cp /opt/software/ldb_toolchain/share/aclocal/pkg.m4 /opt/doris/thirdparty/src/libxml2-v2.9.10/m4
  2. sh /opt/doris/thirdparty/build-thirdparty.sh
  1. 执行测试 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 No such file or directory

        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 编译,需设置 ldb 环境变量

    • 解决方案

      配置 ldb 环境变量

  1. # 配置环境变量
  2. vim /etc/profile.d/ldb.sh
  3. export LDB_HOME=/opt/software/ldb_toolchain
  4. export PATH=$LDB_HOME/bin:$PATH
  5. # 保存退出并刷新环境变量
  6. source /etc/profile.d/ldb.sh
  7. # 测试
  8. gcc --version
  9. > gcc-11
  1. 编译过程中止,提示 “ninja failed with: signal: killed” 相关字样

    • 问题描述

      BE 或三方库在编译中途失败,提示字样包含

      ninja failed with: signal: killed

    • 问题原因

      所在机器内存不足

    • 解决方案

      换用更大内存(至少16GB)的机器进行编译

启动问题

  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.soglibc-compatibility/ 字样

    • 问题原因 当前机器 glibc 版本过低。可以通过 ldd --version 确认,如果版本小于 2.27 则可能发生这一问题。

    • 解决方案 重新编译 BE,编译时增加环境变量:

  1. export GLIBC_COMPATIBILITY=OFF

其他组件问题

  • 问题描述

    如有以下组件的错误提示,则统一以该方案解决:

    • bison 相关
      1. 安装 bison-3.0.4 时报 fseterr.c 错误
    • flex 相关
      1. flex 命令未找到
    • cmake 相关
      1. cmake 命令未找到
      2. cmake 找不到依赖库
      3. cmake 找不到 CMAKE_ROOT
      4. cmake 环境变量 CXX 中找不到编译器集
    • boost 相关
      1. Boost.Build 构建引擎失败
    • mysql 相关
      1. 找不到 mysql 的客户端依赖 a 文件
    • gcc 相关
      1. GCC 版本需要11+
  • 问题原因

    未使用正确的 ldb-toolchain 进行编译

  • 解决方案

    • 检查 ldb-toolchain 环境变量是否配置
    • 查看 gcc 版本是否与使用ldb-toolchain编译文档中推荐一致
    • 删除 ldb_toolchain_gen.aarch64.sh 脚本执行后的 ldb 目录,重新执行并配置环境变量,验证 gcc 版本