简介面向国产化信创环境的大数据从业者与运维工程师这份资源提供在华为鲲鹏920aarch64架构与麒麟V10操作系统上编译完成的ClickHouse 21.8.14安装包解决ARM平台下OLAP数据库部署时编译器兼容、库依赖与性能调优等难题。压缩包共20个文件约115.69MB以可执行二进制程序为主涵盖clickhouse-server、clickhouse-client、clickhouse-keeper、clickhouse-copier、clickhouse-benchmark等核心组件另附config.xml、users.xml配置文件及install.sh、uninstall.sh一键安装与卸载脚本并集成clickhouse-server.service系统服务单元便于开机自启。已有2147人学习下载。借助现成二进制与脚本读者可跳过源码编译环节在麒麟V10上快速完成依赖检查、用户创建、目录配置与服务注册直接投入建表、导入数据、SQL查询与性能监控等实际分析工作为自主可控环境下的大数据处理提供可复用的部署基础。1. 鲲鹏麒麟V10上装ClickHouse 21.8.14为什么源码编译是唯一的路在鲲鹏服务器上装 ClickHouse如果你习惯性打开终端敲下apt-get install clickhouse-server或者去官网下个 x86_64 的 tgz 包直接解压大概率会在启动那一刻看到一行冷冰冰的Exec format error。这不是配置写错了是 CPU 架构根本不匹配——鲲鹏是 ARM64aarch64而 ClickHouse 官方长期只提供 x86_64 的预编译二进制。更麻烦的是麒麟 V10 操作系统基于国产内核深度定制glibc 版本、依赖库路径和主流发行版都有差异即便找到 ARM 版通用包也未必能在这套系统上跑稳。所以在鲲鹏麒麟 V10 这个组合下源码编译几乎是唯一能让你拿到一个可控、可调试、可长期运行的 ClickHouse 21.8.14 的方式。这篇笔记记录的就是我从零编译到验证跑通的完整过程适合正在国产化环境里部署 OLAP 组件的运维和开发也适合第一次接触 ARM 交叉编译、想少走弯路的同行。2. 编译前环境准备鲲鹏架构下的依赖清单与版本锁定2.1 确认系统架构与内核版本动手之前先别急着装依赖把底子摸清楚。很多编译失败不是缺库而是系统信息没对齐导致后面 CMake 找错了路径。# 确认 CPU 架构必须输出 aarch64 uname -m # 查看麒麟 V10 的具体版本和内核 cat /etc/kylin-release uname -r # 查看 glibc 版本ClickHouse 21.8 对 glibc 有最低要求 ldd --version | head -1uname -m输出aarch64说明是 ARM64 环境如果输出x86_64那说明你连错机器了。/etc/kylin-release里一般会标明是 V10 SP1 还是 SP2SP2 的 glibc 通常更新一些编译时遇到的兼容问题会少。ldd --version看 glibc 版本21.8.14 这个版本建议 glibc 不低于 2.28麒麟 V10 默认满足但如果之前有人手动升级过系统库这里要特别留意。2.2 安装编译工具链与核心依赖麒麟 V10 的软件源里包不算新但编译 ClickHouse 21.8.14 够用了。我一般会一次性把下面这组依赖装齐避免编译到一半报缺库再回头补。# 更新源并安装基础编译工具 sudo yum install -y gcc gcc-c cmake3 ninja-build git wget # 安装 ClickHouse 编译所需的开发库 sudo yum install -y openssl-devel zlib-devel libicu-devel \ libxml2-devel readline-devel ncurses-devel \ python3-devel ccache # 确认 cmake 版本21.8 要求 cmake 3.10 cmake3 --version这里有几个点值得展开。cmake3在麒麟源里是独立包直接敲cmake可能指向旧版本所以后面所有 CMake 命令我都用cmake3。ccache不是必须的但源码编译 ClickHouse 动辄一两个小时加上它第二次编译能省一半时间属于后悔药级别的工具。libicu-devel是处理字符集和排序规则的缺了它编译到一半会报 ICU 相关错误而且这个错误往往出现在编译后期非常浪费时间。2.3 调整系统参数与创建编译用户ClickHouse 编译过程对文件句柄数和内存有一定要求尤其是链接阶段。另外不建议直接用 root 编译权限太宽容易把系统库路径搞乱。# 临时提高文件句柄限制 ulimit -n 65535 # 创建专用编译用户 sudo useradd -m -s /bin/bash chbuilder sudo passwd chbuilder # 切换到编译用户 su - chbuilderulimit -n只对当前会话生效如果编译中途断开重连记得重新执行。专用用户chbuilder的好处是编译产物都在它自己的 home 目录下不会污染系统路径后面清理也方便。如果团队里多人维护建议把这个用户的 home 目录放在独立分区避免编译临时文件把根分区撑满。3. 获取源码与配置编译参数从 git clone 到 cmake 生成3.1 拉取 ClickHouse 21.8.14 源码ClickHouse 的源码仓库比较大直接 clone 完整历史会非常慢。我一般用浅克隆加指定 tag 的方式只拿需要的版本。# 浅克隆指定分支减少下载量 git clone --branch v21.8.14.5-lts --depth 1 \ https://github.com/ClickHouse/ClickHouse.git # 进入源码目录 cd ClickHouse # 确认当前 commit 和 tag git log --oneline -1 git describe --tags--branch v21.8.14.5-lts对应的是 21.8 系列的 LTS 版本--depth 1表示只拉取最近一次提交不下载完整历史。如果你所在网络对 GitHub 访问不稳定可以先用wget下载对应版本的 tar.gz 包再解压效果一样。git describe --tags用来确认你拿到的确实是 21.8.14 相关版本避免拉错分支。3.2 配置 CMake 编译选项ClickHouse 的 CMake 选项很多但在鲲鹏麒麟这个场景下真正需要关注的就那么几个。下面是我在多次编译后固定下来的一套配置。# 创建独立编译目录保持源码目录干净 mkdir -p build cd build # 执行 cmake 配置 cmake3 .. \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr/local/clickhouse \ -DENABLE_TESTSOFF \ -DENABLE_UTILSON \ -DUSE_INTERNAL_SSL_LIBRARYON \ -DUSE_INTERNAL_ZLIB_LIBRARYON \ -DUSE_INTERNAL_ICU_LIBRARYOFF \ -DCMAKE_C_COMPILERgcc \ -DCMAKE_CXX_COMPILERg \ -DCMAKE_CXX_FLAGS-marcharmv8-a -O2逐项说明一下。CMAKE_BUILD_TYPERelease是必须的Debug 版本编译更慢且运行性能差。CMAKE_INSTALL_PREFIX指定安装路径我习惯放在/usr/local/clickhouse和系统包管理器隔离。ENABLE_TESTSOFF关掉测试用例编译能省大量时间。USE_INTERNAL_SSL_LIBRARYON和USE_INTERNAL_ZLIB_LIBRARYON让 ClickHouse 使用自带的 SSL 和 zlib 库避免麒麟系统库版本不匹配导致的链接错误。USE_INTERNAL_ICU_LIBRARYOFF是因为麒麟源里的 ICU 版本够用用系统的能减小二进制体积。-marcharmv8-a是针对鲲鹏处理器的优化标志如果编译报非法指令可以去掉这个参数改用默认。3.3 处理 CMake 配置阶段的常见报错CMake 配置阶段最容易出问题的就是找不到某个库或者版本不满足。下面是我遇到过的几个典型情况。# 如果报找不到 OpenSSL export OPENSSL_ROOT_DIR/usr/lib64/openssl # 如果报 Python 版本不对 export PYTHON_EXECUTABLE/usr/bin/python3 # 如果报 ccache 未找到但你又想用 export CCACHE_PATH/usr/bin/ccacheOPENSSL_ROOT_DIR在麒麟 V10 上有时需要手动指定因为 OpenSSL 的头文件和库文件可能不在 CMake 默认搜索路径里。PYTHON_EXECUTABLE指向系统 Python3ClickHouse 编译过程中会用到 Python 脚本生成一些代码。这些环境变量在重新执行cmake3之前 export 一下即可不需要写进系统配置文件。4. 编译与安装ninja 加速与产物部署4.1 启动编译并控制并发数ClickHouse 源码编译非常吃资源并发数开太大容易内存溢出开太小又慢得让人怀疑人生。我的经验是看机器内存来定。# 查看 CPU 核心数和内存 nproc free -h # 启动编译-j 后面跟并发数 ninja -j$(nproc) # 如果内存不足 32G建议降低并发 ninja -j4nproc输出的是 CPU 核心数但并发数不能直接等于核心数。ClickHouse 单个编译单元峰值内存可能到 2-3GB如果机器只有 16GB 内存-j16几乎必然触发 OOM。我一般按「内存 GB 数除以 3」来估算安全并发数。编译过程中如果看到c: fatal error: Killed signal terminated program cc1plus基本就是内存不够降低-j重新来即可ninja 会从断点继续不会从头编译。4.2 安装编译产物编译完成后安装步骤相对简单但路径和权限要处理好。# 执行安装 sudo ninja install # 查看安装目录结构 ls -lh /usr/local/clickhouse/ ls -lh /usr/local/clickhouse/bin/安装完成后/usr/local/clickhouse/bin/下应该有clickhouse这个主程序/usr/local/clickhouse/etc/下会有默认配置文件。如果bin目录为空说明编译阶段有问题需要回头看 ninja 的输出日志。安装目录的权限建议保持 root 所有后续用 systemd 管理服务时更规范。4.3 创建数据目录与配置文件ClickHouse 默认配置里数据目录是/var/lib/clickhouse日志目录是/var/log/clickhouse-server这些目录需要手动创建并授权。# 创建数据与日志目录 sudo mkdir -p /var/lib/clickhouse /var/log/clickhouse-server sudo chown -R clickhouse:clickhouse /var/lib/clickhouse sudo chown -R clickhouse:clickhouse /var/log/clickhouse-server # 创建 clickhouse 系统用户 sudo useradd -r -s /sbin/nologin clickhouseclickhouse用户是运行服务的专用账户-r表示系统用户-s /sbin/nologin禁止登录。数据目录和日志目录的属主必须是这个用户否则服务启动时会报权限拒绝。如果之前已经存在这些目录检查一下属主是否正确。5. 避坑与排查鲲鹏麒麟编译中最容易翻车的五个点5.1 编译到一半报 Killed signal现象ninja 编译过程中突然中断终端输出c: fatal error: Killed signal terminated program cc1plus。原因并发编译时内存耗尽系统 OOM Killer 杀掉了编译进程。解决降低ninja -j的并发数比如从-j16降到-j4然后重新执行ninja。ninja 会自动从上次中断的地方继续不需要重新 cmake。如果机器内存实在太小可以临时加 swap 分区顶一下。5.2 链接阶段报 undefined reference to__aarch64_...现象编译到最后链接可执行文件时报一堆undefined reference错误符号名里带aarch64。原因CMake 配置时用了-marcharmv8-a但系统 GCC 版本较旧不支持某些指令集扩展。解决去掉-DCMAKE_CXX_FLAGS里的-marcharmv8-a改用默认编译选项重新 cmake。或者升级 GCC 到 9 以上版本再试。麒麟 V10 自带的 GCC 版本一般是 7.x对 ARMv8 新指令支持有限。5.3 启动时报Cannot allocate memory现象ClickHouse 服务启动失败日志里写Cannot allocate memory或mmap failed。原因麒麟 V10 默认的vm.max_map_count值偏小ClickHouse 需要大量内存映射。解决修改系统参数并生效。# 临时生效 sudo sysctl -w vm.max_map_count262144 # 永久生效 echo vm.max_map_count262144 | sudo tee -a /etc/sysctl.conf sudo sysctl -p5.4 客户端连接报Connection refused现象clickhouse-client连接本机 9000 端口被拒绝但服务进程存在。原因配置文件里listen_host默认只绑定了127.0.0.1或者防火墙拦截了端口。解决检查/usr/local/clickhouse/etc/clickhouse-server/config.xml里的listen_host配置改成0.0.0.0允许外部访问。同时确认麒麟 V10 的 firewalld 是否放行了 9000 和 8123 端口。5.5 查询时中文乱码或排序异常现象插入中文数据后查询显示乱码或者ORDER BY结果不符合预期。原因编译时 ICU 库链接不正确或者客户端字符集设置不对。解决确认 cmake 时USE_INTERNAL_ICU_LIBRARYOFF且系统安装了libicu-devel。客户端连接时加上--charsetutf8参数。如果还是乱码检查麒麟系统的 locale 设置确保LANG是zh_CN.UTF-8或en_US.UTF-8。6. 装完怎么验证从服务启动到查询跑通的完整检查链编译安装完成不等于能用我习惯按下面这条链路走一遍每一步都确认通过再交给业务方。6.1 启动服务并检查进程状态# 前台启动方便看日志输出 sudo -u clickhouse /usr/local/clickhouse/bin/clickhouse-server \ --config-file/usr/local/clickhouse/etc/clickhouse-server/config.xml # 另开终端确认进程和端口 ps -ef | grep clickhouse-server ss -tlnp | grep -E 9000|8123前台启动能看到实时日志如果配置有问题会直接打印错误。确认9000TCP 协议和8123HTTP 协议两个端口都处于监听状态。如果只监听了一个检查配置文件里对应的tcp_port和http_port是否被注释掉了。6.2 用客户端执行验证查询# 连接本地服务 /usr/local/clickhouse/bin/clickhouse-client --host 127.0.0.1 --port 9000 # 在客户端里执行 SELECT version(); SELECT 1 1; SHOW DATABASES;SELECT version()应该返回21.8.14.5和编译版本一致。SELECT 1 1返回2说明查询引擎正常。SHOW DATABASES至少能看到default和system两个库。如果客户端连接报认证错误检查配置文件里users段的密码设置默认default用户是空密码。6.3 建表插入查询全链路测试-- 创建测试表 CREATE TABLE test_arm ( id UInt32, name String, ts DateTime ) ENGINE MergeTree() ORDER BY id; -- 插入数据 INSERT INTO test_arm VALUES (1, 鲲鹏测试, now()), (2, 麒麟验证, now()); -- 查询验证 SELECT * FROM test_arm ORDER BY id;建表时ENGINE MergeTree()是 ClickHouse 最核心的表引擎ORDER BY id指定排序键。插入中文数据能正常显示说明字符集没问题。查询结果按 id 排序输出说明存储和查询链路都通了。这一步跑通基本可以确认这套编译产物在生产环境可用。6.4 配置 systemd 托管服务前台启动验证通过后改成 systemd 管理方便开机自启和日志收集。# /etc/systemd/system/clickhouse-server.service [Unit] DescriptionClickHouse Server Afternetwork.target [Service] Typesimple Userclickhouse Groupclickhouse ExecStart/usr/local/clickhouse/bin/clickhouse-server --config-file/usr/local/clickhouse/etc/clickhouse-server/config.xml Restarton-failure LimitNOFILE65535 [Install] WantedBymulti-user.targetLimitNOFILE65535对应前面 ulimit 的设置systemd 环境下需要单独声明。Restarton-failure让服务异常退出后自动拉起。写完执行systemctl daemon-reload systemctl enable --now clickhouse-server即可。从那以后我每次编译完 ClickHouse都会强制走一遍「前台启动 → 客户端查询 → 建表插入 → systemd 托管」这条链路少一步都可能在上线后才发现问题。希望这份笔记帮你在鲲鹏麒麟的环境里少踩几个坑顺利把 ClickHouse 21.8.14 跑起来。本文还有配套的精品资源点击获取