Clickhouse适配arm64环境

Clickhouse适配arm64环境

前言

官方目前有arm64版本的镜像,但是放到xc环境上跑都跑不起来,连报错都没有....

没办法,只能自己折腾

适配

参考资料

还有百度到的一些前辈的编译构建资料,源作者不清楚,N个网站都是一样的内容....

环境准备

本机环境:

​ Macbook Pro M2 , macOS 15.0.1,Docker 24+

x86环境支持交叉编译,下文会给出参数

服务器环境:

​ Kunpeng 920,UOS Server V20, Docker 21+

clickhouse版本:

​ git master版本,2024年11月的版本为 24.11.1.1

编译步骤

克隆源码

下载当前master分支版本代码, --recursive参数会下载所有的子模块,整个仓库完整下载差不多要4G。

另外直连github和镜像仓库都不是很稳定,建议全程挂梯子。

git clone --recursive https://github.com/ClickHouse/ClickHouse.git && cd Clickhouse

如果想编译指定的版本,比如v24.10.2.80-stable,可以增加branch参数

git clone --recursive --branch v24.10.2.80-stable https://github.com/ClickHouse/ClickHouse.git && cd Clickhouse

虚拟环境搭建

因为最终目标是打包成docker镜像并使用k8s进行管理,所以源码拉下来之后,先创建环境。这里选择使用源码中的对应版本的ubuntu并通过docker启动虚拟环境,启动镜像记得将clickhouse的源码从宿主机挂载到容器内,注意替换对应路径

这样的好处是保证一致性,打包完就可以正常运行

另外可以自行替换基础镜像,比如麒麟,统信,不过没测试过,不保证可行。

为了保证能顺利编译arm64版本,x86架构的docker可以考虑使用QEMU运行arm64版本的ubuntu做为虚拟环境

Multi-platform | Docker Docs

# 拉取基础镜像,arm64版本放开注释
docker pull ubuntu:22.04 #--platfrom=linux/arm64
# 启动虚拟环境
docker run -itd -p 8123:8123 \
-v /Users/shadow/workspace/ClickHouse:/Clickhouse \
--name=clickhouse-build-env \
ubuntu:22.04
# 通过管理工具进入容器或者终端进入
docker exec -itd clickhouse-build-env /bin/bash

安装依赖

然后开始编译的准备工作,先安装依赖

# 更新仓库
apt-get update
# 下载依赖包
apt-get -y install cmake ccache python3 ninja-build nasm yasm gawk lsb-release wget software-properties-common gnupg --fix-missing
# 安装Clang编译器
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" 
# 如果Clang报错,可以增加PPA(Personal Package Archive,个人软件包存档)
add-apt-repository -y ppa:ubuntu-toolchain-r/test

安装完成后,可以在.bashrc中添加Clang变量

echo export CC=clang-18 >> ~/.bashrc
echo export CXX=clang++-18 >> ~/.bashrc

本地编译安装

自定义编译选项

DCMAKE_TOOLCHAIN_FILE参数可以指定arm64架构的编译工具链

  • -Bbuild-arm64: arm64版本
  • -DHAVE_SSE41=0: 关闭sse指令集
  • -DCMAKE_INSTALL_PREFIX: clickhouse编译后的安装路径,个人习惯是release
  • -DHAVE_SSE42=0:关闭sse指令集
  • -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake:arm64的tookchain
  • -DPARALLEL_COMPILE_JOBS=16: 开启16个编译job
  • -S: Source,源 . 为当前目录
  • -B: Build编译目录 一般为build
cmake -Bbuild-arm64 -DHAVE_SSE41=0 -DCMAKE_INSTALL_PREFIX=./release -DHAVE_SSE42=0 -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake -DPARALLEL_COMPILE_JOBS=16 -S . -B build

开启编译后一半15-20分钟左右可以完成,在-B参数的目录下会生产编译需要的环境与文件,然后可以开始正式编译/安装

  • 安装(推荐),只生成程序与对应依赖和配置,没有多余的文件
cmake --install build
  • 编译,一般先做本地调试,观测编译的情况,比如是不是缺少依赖之类的
cmake --build build

正常完成后,在对应的目录下会生成clickhouse的可执行文件

  • 测试,启动正常无报错说明成功运行arm版本clickhouse
cd ./release
./bin/clickhouse-server --config-file=./etc/clickhouse-server/config.xml 

正常启动后截图如下:

image-20241119223736228

打包Docker镜像

考虑到编译环境后续版本升级还需要继续操作,不直接将当前的环境打包了。

在Clickhouse源码根目录新建Dockerfile,将安装目录release 打包docker镜像

#[必须] 基础镜像
FROM ubuntu:22.04
#[可选] 工作目录
WORKDIR /var/lib/clickhouse
#[必须] 软件
COPY ./release /clickhouse
#[必须] 创建用户非root用户运行
RUN groupadd -r clickhouse --gid=101 \
    && useradd -r -g clickhouse --uid=101 --home-dir=/var/lib/clickhouse --shell=/bin/bash clickhouse
#[可选] 安装依赖和常用工具
RUN apt update \
    && apt install --yes --no-install-recommends ca-certificates locales tzdata vim curl
#[必须] 命令拷贝到/usr/bin同时将默认配置拷贝至/etc/对应的目录下, 与官方镜像配置保持一致
RUN ln -s /clickhouse/bin/clickhouse-server /usr/bin/clickhouse-server \
    && ln -s /clickhouse/bin/clickhouse-client /usr/bin/clickhouse-client \
    && ln -s /clickhouse/bin/clickhouse-local /usr/bin/clickhouse-local \
    && cp -r /clickhouse/etc/clickhouse-server /etc/clickhouse-server \
    && cp -r /clickhouse/etc/clickhouse-client /etc/clickhouse-client
#[必须] 数据卷宿主机挂载
VOLUME /var/lib/clickhouse
VOLUME /var/log/clickhouse-server
#[必须] 暴露端口
EXPOSE 9000 8123 9009
#[必须] 启动命令
ENTRYPOINT ["clickhouse-server", "-C", "/etc/clickhouse-server/config.xml"]

然后编写build脚本

#!/usr/bin/env bash
# [可选]私仓地址变量
registry={ip}
# [必须]docker镜像版本,建议增加-aarch64区分
version=24.11.1.1-aarch64
# [可选]镜像名称
name=clickhouse/clickhouse-server
# [必须]删除本地容器
docker rm "$(docker ps -a -f name=${name} -q)"
# [必须]删除本地镜像
docker rmi "$(docker image ls -f reference=${name} -q)" -f
# [必须]构建镜像,指定arm64
docker build -t ${name}:${version} . --platform=linux/arm64 --build-arg VERSION=${version}
# [可选]保存本地
docker save -o ./release/"${name}.tar" ${name}:${version}
# [可选]推送私仓
#docker tag ${name}:${version} ${registry}/${name}:${version}
#docker push ${registry}/${name}:${version}
# [可选]启动镜像,本地调试与下载插件,如要使用注意修改路径
#docker run -p 8123:8123 -v /Users/shadow/workspace/ClickHouse/build/config.xml:/etc/clickhouse-server/config.xml --name=clickhouse ${name}:${version}
# [可选]删除本地镜像,节省磁盘空间
#docker container rm "$(docker container ls -a -f name=clickhouse -q)" -f
#docker rmi "$(docker image ls -f reference=clickhouse -q)" -f

打包docker镜像

sh build.sh

顺利的话可以看到对应的镜像

dockder container ls

image-20241119232557019

部署

按照官方文档启动即可,这里就不详细介绍了,具体可以参考

clickhouse/clickhouse-server - Docker Image | Docker Hub

ClickHouse/docker/server at master · ClickHouse/ClickHouse (github.com)

FAQ

Could NOT find Threads (missing: Threads_FOUND)

# Clickhouse 根目录 CMakeLists.txt 第一行添加
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
set(THREADS_PREFER_PTHREAD_FLAG ON)