Перейти к содержимому
Последнее обновление

Сборка Apache Doris на платформах ARM

В этом документе описана сборка Apache Doris на платформах ARM64, включая совместимость оборудования и операционных систем, установку зависимостей и процесс сборки.

к сведению

Этот документ носит справочный характер. В разных окружениях ARM могут возникать и другие ошибки. Сообщить о них или предложить решения можно в Issues репозитория doris-website.

подсказка

Начиная с версии 3.0.3, платформа ARM поддерживает сборку и развёртывание в режиме с разделением вычислений и хранения.

1. Совместимость оборудования и операционных систем​

Сообщество проверило следующие окружения:

Операционная системаВерсияПример процессора
KylinOSKylin-Server-10-SP1-Release-Build04-20200711Phytium FT-2000+/64
CentOS7.9 и выше (AltArch)aarch64
Ubuntu20.04aarch64
Размер страницы памяти

Дистрибутивы для серверов 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)​

КомпонентВерсияПримечания
Git2.0+
JDK1.8.0Для сборки 3.0+ или master требуется JDK 17
Maven3.6.3Рекомендуется 3.9.9
NodeJS16.3.0
LDB Toolchain0.9.1Для ARM рекомендуется 0.21+
autoconf2.69Установка из исходного кода
bison3.0.4
Стандартные системные пакетыУстанавливаются автоматически с помощью yum/aptbyacc, patch, automake, libtool, make, which, file, ncurses-devel, gettext-devel, unzip, bzip2, zip, util-linux, wget, git, python2

2.2 Команды для установки программного окружения​

  1. Создайте корневые каталоги для загружаемых пакетов и установленного программного обеспечения
# Create the root directory for downloaded packages
mkdir /opt/tools
# Create the root directory for installed software
mkdir /opt/software
  1. Установите зависимости
  • 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/
  1. Настройте переменные окружения
# 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
  1. Установите дополнительное программное обеспечение и компоненты
# 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

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. Возможные причины:

    1. В Ubuntu возникает проблема при загрузке переменных окружения, из-за чего индекс в каталоге ldb не загружается.
    2. Во время сборки 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.