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做为虚拟环境
# 拉取基础镜像,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
正常启动后截图如下:
打包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
部署
按照官方文档启动即可,这里就不详细介绍了,具体可以参考
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)