ClickHouse 编译

Posted on Thu, May 13, 2021 Linux ClickHouse

前言

应同事请求协助帮忙编译 ClickHouse,虽然个人对 ClickHouse 及 C++ 语言不熟悉,但编译其实万变不离其宗,把控好网络、组件版本、环境变量,再严格遵循官网编译步骤,其实可以解决绝大部分的软件编译问题。

PS:Docker 可以很好的解决编译环境的问题,这或许也是近年来越来越多项目提供 docker 编译方式的原因吧。

1. 版本

1.1 ClickHouse

拉取 ClickHouse 镜像,这里使用码云上的镜像进行加速:git clone https://gitee.com/mirrors/clickhouse.git,并切换为 20.6.6.7 分支。

1.2 安装 ninja

这里安装 ninja 1.9,参考ninja 官网:http://blog.fpliu.com/it/software/ninja 。 ClickHouse 20.6.6.7 要求至少 1.8,这里直接按照 ninja 官网首页来:

 curl -LO https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip
 unzip ninja-linux.zip -d ~/bin
 export PATH=$PATH:~/bin
 # 此处建立软连接,否则编译时会提示找不到 ninja
 ln -s ~/bin/ninja /usr/bin/ninja-build

1.3 安装 gcc

根据官网教程,ck 20.6.6.7 版本应使用 gcc-9,这里使用 devtoolset 来进行 gcc 版本的切换。

如果 gcc 版本不为 9,且安装了其他版本的 devtoolset,记得先卸载掉 devtoolset。

安装 devtoolset-9,并切换为 gcc-9,参照 https://www.cnblogs.com/52fhy/p/12547521.html

 yum -y install centos-release-scl
 yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
 scl enable devtoolset-9 bash

1.4 安装 cmake

cmake 版本至少 3 以上:

 $ cmake --version
 cmake version 3.14.5

2. 编译

2.1 x86 平台

重点:在前面规整了各编译组件的版本后,本质上还出现编译错误的原因都是 ClickHouse 的依赖包下载不全或者下载错误,这里通过修改 ClickHouse 依赖的子模块为码云 gitee 仓库解决。

上述几个仓库,都是码云官方拉取了 github 上的仓库,为国内提供加速的。

知道这上面三个仓库后,我们需要做的就是将 ClickHouse 依赖的子项目配置及其子项目依赖的子项目(部分子项目也有自身依赖的子项目)替换为码云上的仓库:sed -i -r "s/github.com\/.+\//gitee.com\/ClickHouse-Build\//g" .gitmodules

NOTE:上述命令只是举个例子,实际上需要根据具体场景,将各个 git 项目下的 github 路径替换为 gitee 路径。之所以列出三个镜像仓库,是因为部分子项目在 ClickHouse-Build 中也没有,此时需要到剩余两个仓库中寻找并手动替换。当然更好的方法是能够搭建一个 vpn,这样就无需自己手动替换了。
NOTE:子项目的含义请自行了解 git 的 submodule 概念。

替换完成后,在 ClickHouse 顶级目录执行 git submodule sync --recursive 同步修改的子项目配置,之后再执行 git submodule update --init --recursive 拉取子项目,根据报错提示,逐个修改子模块的仓库路径。

需要注意的是,有部分子项目的项目命名在 gitee 跟 github 上有一点区别,这里逐个列出:

 # vim $ClickHouse_HOME/.gitmodules
 
 [submodule "contrib/aws"]
     path = contrib/aws
     url = https://github.com/ClickHouse-Extras/aws-sdk-cpp.git
 # 替换为
 [submodule "contrib/aws"]
         path = contrib/aws
         url = https://gitee.com/ClickHouse-Build/aws.git

最后在 ClickHouse 顶级目录执行下列命令进行编译:

 # 参考:https://clickhouse.tech/docs/v20.3/en/development/build/
 $ export CC=gcc-9
 $ export CXX=g++-9
 $ cd ClickHouse
 $ mkdir build
 $ cd build
 # 执行 cmake 的时候,一定要仔细观察输出信息,详见下述文字详细说明
 $ cmake ..
 $ ninja clickhouse
 $ cd ..

执行 cmake 的时候,一定要仔细观察输出信息,若出现下述信息:

 ......
 -- The following OPTIONAL packages have not been found:
 
  * Arrow
  * Parquet
 ......

那么需要仔细检查 $ClickHouse_HOME/contrib 下对应的模块是否存在,以及 .gitmodules 对应模块的配置是否正确,否则会导致编译失败。 如果发现模块拉取失败,则可以删除 $ClickHouse_HOME/contrib/模块 的文件夹,然后重新执行 git submodule sync --recursive 以及 git submodule update --init --recursive 重新拉取模块。

最后会生成 $ClickHouse_HOME/build/programs/clickhouse 可执行文件,用于启动 client、server 等。

官网教程: https://gitee.com/ClickHouse-Build/aws.git

2.2 鲲鹏服务器 + ARM 平台

对于 鲲鹏服务器 + ARM 平台,通过华为的技术人员得知,在编译时需要执行一些额外步骤:

  1. 修改contrib/CMakeLists.txt,WITH 1修改为WITH 0:sed -i 's!WITH_ACLE 1!WITH_ACLE 0!g' contrib/CMakeLists.txt
  2. 关闭 WERROE:sed -i 's!WERROR "Enable -Werror compiler option" ON!WERROR "Enable -Werror compiler option" OFF!g' CMakeLists.txt
  3. 对于 GCC 9.1 以上,可以添加 ARM 独有优化,vim cmake/cpu_features.cmake 添加如下内容:
     if (ARCH_AARCH64)
         set (COMPILER_FLAGS "${COMPILER_FLAGS}   -march=armv8.2-a+fp+simd+crc+lse  -mtune=tsv110 -fPIC ")
     endif()
  4. 执行 cmake 时需要关闭 unwind(ARM 不支持,且仅在异常测试的时候使用):cmake3 .. -DENABLE_TCMALLOC=OFF -DUSE_UNWIND=OFF -DENABLE_JEMALLOC=OFF -DCMAKE_INSTALL_PREFIX