Сборка Apache Doris на платформах ARM
В этом документе описана сборка Apache Doris на платформах ARM64, включая совместимость оборудования и операционных систем, установку зависимостей и процесс сборки.
Этот документ носит справочный характер. В разных окружениях ARM могут возникать и другие ошибки. Сообщить о них или предложить решения можно в Issues репозитория doris-website.
Начиная с версии 3.0.3, платформа ARM поддерживает сборку и развёртывание в режиме с разделением вычислений и хранения.
1. Совместимость оборудования и операционных систем
Сообщество проверило следующие окружения:
| Операционная система | Версия | Пример процессора |
|---|---|---|
| KylinOS | Kylin-Server-10-SP1-Release-Build04-20200711 | Phytium FT-2000+/64 |
| CentOS | 7.9 и выше (AltArch) | aarch64 |
| Ubuntu | 20.04 | aarch64 |
Дистрибутивы для серверов ARM поставляются с ядрами, использующими страницы памяти размером 4 KiB или 64 KiB (в KylinOS V10 и CentOS 7/8 aarch64 обычно используется 64 KiB, в Ubuntu — 4 KiB); проверить размер можно командой getconf PAGESIZE. При сборке jemalloc для Doris на ARM используется --with-lg-page=16, поэтому один и тот же бинарный файл работает с ядрами, использующими любой из этих размеров страниц. Однако в некоторых сторонних библиотеках предположения о размере страницы фиксируются при сборке. Если вы самостоятельно выполняете сборку или проверку, проверяйте её на том ядре, на котором будете развёртывать Doris; см. пункт 4 в разделе 4.2 FAQ.
Пример вывода:
# 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
- Создайте корневые каталоги для загружаемых пакетов и установленного программного обеспечения
# Create the root directory for downloaded packages
mkdir /opt/tools
# Create the root directory for installed software
mkdir /opt/software
- Установите зависимости
- Git
# To skip the compilation hassle, install directly with yum
yum install -y git
- JDK 8
# When compiling Doris 2.1 or earlier versions, you can install JDK 8
# Option 1: Install directly with yum. The devel package provides tools such as jps
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# Option 2: Download the arm64 package, extract it, and configure environment variables
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
# To compile Doris 3.0 (inclusive) or later versions, or the master branch, replace JDK 8 with JDK 17
yum install -y java-17-openjdk java-17-openjdk-devel
- Maven
cd /opt/tools
# Download, extract, and configure environment variables
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
# Download the arm64 package
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
# Download the ARM version of LDB Toolchain
wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.21/ldb_toolchain_gen.aarch64.sh && \
bash ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/
- Настройте переменные окружения
# Configure environment variables (using JDK 8 as an example)
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
# Save, exit, and refresh environment variables
source /etc/profile.d/doris.sh
# Verify the installation (using JDK 8 as an example)
java -version
> java version "1.8.0_291"
mvn -version
> Apache Maven 3.9.9
node --version
> v16.3.0
gcc --version
> gcc-11
- Установите дополнительное программное обеспечение и компоненты
# Install common system packages
sudo yum install -y byacc patch automake libtool make which file ncurses-devel gettext-devel unzip bzip2 bison zip util-linux wget git python2
# Install 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
- Проверьте командную оболочку
В Ubuntu /bin/sh по умолчанию указывает на dash, а не на bash. Чтобы некоторые скрипты могли выполняться, необходимо переключить его на bash. Сначала проверьте, на что сейчас указывает sh:
ls -al /bin/sh
Для переключения выполните следующую команду:
sudo dpkg-reconfigure dash
В интерактивном интерфейсе выберите no (не использовать dash как оболочку по умолчанию), и /bin/sh будет указывать на bash.
- Создайте корневые каталоги для загружаемых пакетов и установленного программного обеспечения
# Create the root directory for downloaded packages
mkdir /opt/tools
# Create the root directory for installed software
mkdir /opt/software
- Установите зависимости
- Git
# Install directly with apt-get
apt-get -y install git
- JDK 8
# Download the arm64 package, extract it, and configure environment variables
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
# To compile Doris 3.0 (inclusive) or later versions, or the master branch, replace JDK 8 with JDK 17
apt-get -y install openjdk-17-jdk
- Maven
cd /opt/tools
# Download, extract, and configure environment variables
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
# Download the arm64 package
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
# Download the ARM version of LDB Toolchain
wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.21/ldb_toolchain_gen.aarch64.sh && \
bash ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/
- Настройте переменные окружения
# Configure environment variables (using JDK 8 as an example)
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
# Save, exit, and refresh environment variables
source /etc/profile.d/doris.sh
# Verify the installation (using JDK 8 as an example)
java -version
> java version "1.8.0_291"
mvn -version
> Apache Maven 3.9.9
node --version
> v16.3.0
gcc --version
> gcc-11
- Установите дополнительное программное обеспечение и компоненты
# Install common system packages
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
# Install 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. Этот способ применим к версиям Doris после коммита 7f3564.
Инструкции по загрузке и установке LDB Toolchain приведены в предыдущем разделе. Последующие этапы сборки описаны в документе Сборка с помощью LDB Toolchain. JDK и NodeJS необходимо заменить версиями для aarch64 (см. предыдущий раздел).
Если возникают проблемы с загрузкой готовых сторонних библиотек, соберите их самостоятельно с помощью thirdparty/build-thirdparty.sh. При сборке сторонних библиотек используйте gcc:
export DORIS_TOOLCHAIN=gcc
Следующие параметры сборки работают на ARM иначе, чем на x86_64:
- AVX2:
USE_AVX2применяется только к x86_64, и на ARM его задавать не нужно. Набор инструкций ARM выбирается с помощьюARM_MARCH(в версиях 4.0 и новее, значение по умолчанию —armv8-a+crc), например:ARM_MARCH=armv8-a+crc+simd sh build.sh --be. - libunwind: В версиях 4.1.3 и более ранних (включая 3.x и 4.0) libunwind не работает на ARM, поэтому перед сборкой необходимо выполнить
export USE_UNWIND=OFF. Начиная с master (июль 2026 года) и 4.1.4, параметрUSE_UNWINDудалён (apache/doris#64093): libunwind всегда включён на всех платформах Linux, и установка этой переменной больше ни на что не влияет. Входящая в комплект библиотека libunwind 1.6.2 вызывает аварийное завершение BE при запуске на ядрах со страницами памяти размером 64 KiB; см. пункт 4 в разделе 4.2 FAQ. - Azure: В версиях 4.1 и более ранних
env.shавтоматически устанавливаетDISABLE_BUILD_AZURE=ONна ARM, поэтому ничего задавать не требуется. С августа 2026 года в master (apache/doris#66908) библиотеки Azure также собираются на ARM и по умолчанию включаются в BE при компоновке. Чтобы отключить это, задайтеexport DISABLE_BUILD_AZURE=ON(библиотеки не будут включены в BE); при сборке сторонних библиотекexport DISABLE_THIRDPARTY_BUILD_AZURE=ONдополнительно отключает сборку самого Azure.
Если при сборке или запуске по-прежнему возникают проблемы, обратитесь к часто задаваемым вопросам. Если подходящего решения нет, вы можете создать 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
-
Причина:
По умолчанию система вызывает Python с помощью команд вроде
python2.7,python3.6,python2илиpython3, но зависимостям Doris нужна команда с именемpython(подойдёт версия 2.7+). -
Решение:
Создайте символическую ссылку
/usr/bin/python.
# Check the python installation directory
whereis python
# Create the symbolic link
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 Central
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
-
Решение:
Проверьте сетевое подключение и повторите сборку.
5. Сбой сборки из-за нехватки свободного места
-
Симптом:
Во время сборки не удаётся собрать объект CXX; появляется сообщение об отсутствии свободного места:
fatal error: error writing to /tmp/ccKn4nPK.s: No space left on device
1112 | } // namespace doris::vectorized
compilation terminated.
-
Причина:
На устройстве недостаточно свободного места.
-
Решение:
Освободите место на устройстве, например удалите ненужные файлы.
6. Не найден pkg.m4 в pkg.config
-
Симптом:
При сборке появляется ошибка «файл не найден»:
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не выполняется.
-
Решение:
Скопируйте файл
pkg.m4изldb/aclocalв каталог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:
# Configure environment variables
vim /etc/profile.d/ldb.sh
export LDB_HOME=/opt/software/ldb_toolchain
export PATH=$LDB_HOME/bin:$PATH
# Save, exit, and refresh environment variables
source /etc/profile.d/ldb.sh
# Test
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 аварийно завершается при запуске с созданием дампа памяти, в стеке вызовов присутствует libc.so или glibc-compatibility/
-
Причина:
Версия glibc на текущей машине слишком старая. Проверьте её командой
ldd --version. Эта проблема может возникать в версиях ниже 2.27. -
Решение:
Повторно соберите BE, добавив следующую переменную окружения:
export GLIBC_COMPATIBILITY=OFF
4. BE на ARM аварийно завершается сразу после запуска с созданием дампа памяти, в стеке вызовов присутствуют unw_backtrace, access_mem, is_plt_entry
-
Симптом:
BE для ARM, собранный из версии 4.1.4 или из master после июля 2026 года, завершается с ошибкой сегментации сразу после
start_be.sh. Вbe.outотсутствуют строки журнала BE, а стек вызовов в дампе памяти выглядит примерно так (внутренний вызов указан первым):access_mem
is_plt_entry
_ULaarch64_step
_ULaarch64_tdep_trace
unw_backtrace
...
__libc_csu_initПри этом
getconf PAGESIZEвыводит 65536. -
Причина:
В этих версиях GNU libunwind 1.6.2 статически включается при компоновке на ARM (apache/doris#64093). В её коде проверки памяти для AArch64 жёстко задан размер страницы 4 KiB. На ядре со страницами памяти размером 64 KiB все проверки завершаются неудачно, и libunwind разыменовывает неинициализированный адрес ещё до
main(). Ядра со страницами размером 4 KiB не затронуты, поэтому проблема не воспроизводится на x86_64 и Ubuntu ARM. -
Решение:
Соберите Doris из кода или используйте выпуск, включающий apache/doris#67877 (обновление libunwind до 1.8.3); до этого используйте 4.1.3 на ядрах со страницами размером 64 KiB. Сбой происходит до
main(), поэтому обойти его с помощью настроекbe.confневозможно.
4.3 Проблемы с другими компонентами
-
Симптом
Если появляются сообщения об ошибках для любого из следующих компонентов, воспользуйтесь общим решением, приведённым ниже:
- bison: ошибка fseterr.c при установке bison-3.0.4
- flex: команда flex не найдена
- cmake: команда cmake не найдена / cmake не может найти зависимые библиотеки / cmake не может найти CMAKE_ROOT / cmake не может найти компилятор, заданный в переменной окружения CXX
- boost: ошибка сборки движка Boost.Build
- mysql: не удаётся найти файл .a клиентской зависимости mysql
- gcc: требуется GCC 11+
-
Причина
При сборке не использовался нужный LDB Toolchain.
-
Решение
- Проверьте, настроены ли переменные окружения LDB Toolchain.
- Проверьте, соответствует ли версия gcc рекомендуемой в документе Сборка с помощью LDB Toolchain.
- Удалите каталог ldb, созданный при выполнении
ldb_toolchain_gen.aarch64.sh, запустите скрипт повторно, настройте переменные окружения и проверьте версию gcc.