前言:

因为公司与华为云合作,需要在 ARM 架构芯片的鲲鹏平台上安装 ClickHouse,根据网上的众多教程不断踩坑,最终成功,这篇笔记是目前最完整的编译安装记录,但也仅限于 v20.3.19.4-lts 版本,笔记中所给的链接如果失效请在评论区中反馈,我第一时间会更新新地址。

环境要求:

软硬件 参数
CPU 鲲鹏 920
内存 >= 8GB
硬盘 >= 100GB(编译 CK会占用 60GB)
CentOS 7.6
GCC 9.3.0
CMake 3.18.4
ClickHouse v20.3.19.4-lts

Yum 安装相关依赖:

1
yum -y install lz4-devel openssl-devel zlib-devel zstd-devel protobufdevel libicu-devel readline-devel gperf curl-devel

升级 GCC 到 9.3.0:

CentOS 7.6 系统自带的 GCC 版本是 4.8.5,需要手动编译升级,无需重新安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mkdir -p /opt/gcc-pkg
cd /opt/gcc-pkg
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
tar -zxvf gcc-9.3.0.tar.gz
cd gcc-9.3.0/

# 在下载依赖包时需要先下载这个插件,要不会报错
yum install -y lbzip2

# 下载gmp mpfr mpc等供编译需求的依赖项
./contrib/download_prerequisites

# 创建一个新的目录,并在此目录编译安装,不推荐在源码目录操作
mkdir build && cd build

# 配置参数(参数含义见下)
../configure --prefix=/usr/local/gcc-9.3.0 --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib

# 编译生成 makefile 文件,开 4 个进程进行编译
make -j 4

# 安装 GCC
sudo make install

# 设置环境变量
vim /etc/profile
# 添加以下配置
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64
export CC=/usr/local/gcc-9.3.0/bin/aarch64-unknown-linux-gnu-gcc
export CXX=/usr/local/gcc-9.3.0/bin/aarch64-unknown-linux-gnu-g++
export PATH=/usr/local/gcc-9.3.0/bin:${PATH}

# 设置头文件
sudo ln -sv /usr/local/gcc/include/ /usr/include/gcc

# 设置库文件
touch /etc/ld.so.conf.d/gcc.conf
sudo chmod 777 /etc/ld.so.conf.d/gcc.conf
sudo echo -e "/usr/local/gcc/lib64" >> /etc/ld.so.conf.d/gcc.conf

# 加载动态连接库
sudo ldconfig -v
ldconfig -p | grep gcc

# 测试
gcc --version
gcc -v

–enable-languages表示你要让你的gcc支持哪些编程语言;
–disable-multilib表示编译器不编译成其他平台的可执行代码;
–disable-checking表示生成的编译器在编译过程中不做额外检查
–enable-checking=xxx 表示编译过程中增加XXX检查
–prefix=/usr/local/gcc-9.3.0 指定安装路径
–enable-bootstrap 表示用第一次编译生成的程序进行第二次编译,然后用再次生成的程序进行第三次编译,并且检查比较第二次和第三次结果的正确性,也就是进行冗余的编译检查工作。 非交叉编译环境下,默认已经将该值设为 enable,可以不用显示指定;交叉编译环境下,需要显示将其值设为 disable。

坑 1:GCC 更新后,系统库也要更新:

在把 GCC 更新到 9.3.0 后也需要把系统库更新到与 GCC 相对应的版本,要不在后面编译安装 CMake 的时候会报 libstdc++.so.6: version 'GLIBCXX_3.4.20' not found 或者其他版本错误,解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cp /usr/local/gcc-9.3.0/lib64/libstdc++.so.6.0.28 /usr/lib64
cd /usr/lib64
ln -s libstdc++.so.6 libstdc++.so.6.0.28

# 检查是否包含 GLIBCXX_3.4.* 版本
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28

编译安装 CMake:

cmake 用于编译 Ck

1
2
3
4
5
6
7
8
9
10
mkdir -p /opt/cmake-pkg
cd /opt/cmake-pkg
wget https://github.com/Kitware/CMake/archive/v3.18.4.tar.gz
cd cmake-3.18.4
./bootstrap
# 编译安装
make -j 4
make install
# 查看版本
cmake --version

编译安装 Git:

没有就安装,有就升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 先安装这个依赖,不然在后面 git clone 时会报 https 错误
yum install -y curl-devel

mkdir -p /opt/git-pkg
cd /opt/git-pkg

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.28.0.tar.gz
tar -zxvf git-2.28.0.tar.gz
cd git-2.28.0

# 编译安装
./configure --prefix=/usr/local
make -j 4
make install

# 查看 git 版本
git --version

编译安装 ClickHouse:

从 GitHub 克隆:

这里需要注意一下,克隆下来的 ClickHouse 是很干净的,没有其他依赖的,但是编译 ClickHouse 需要相关的子依赖和父依赖,所以需要运行命令 git submodule update --init –recursive 这个命令会把相关的依赖都下载下来,但是有些依赖是在国外的服务器上的,比如 Google Git 上,国内网络无法访问,所以会导致报错,解决方案有三个:

  1. 在 git 上开代理,直接访问国外的代码仓库(亲测没成功)
  2. 在本机上开代理,使用全局代理(亲测没成功)
  3. 购买国外服务器,可以直接访问国外的代码仓库(亲测可用,要花点钱,可以使用 Vultr 平台,按量付费,用完把实例删掉即可)

提供网盘下载:链接,提取码:1nwb

该版本是 v20.3.19.4-lts 的完整源码

1
2
3
git clone https://github.com/ClickHouse/ClickHouse.git
git checkout v20.3.19.4-lts
git submodule update --init –recursive
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 这里是在国外服务器上的操作,如果下载的是网盘链接里面的文件直接跳过这步
git clone https://github.com/ClickHouse/ClickHouse.git
git checkout v20.3.19.4-lts
git submodule update --init –recursive

# 开始准备编译操作
# 由于各种原因无法将下载完成的包快速下载,SFTP 速度过慢,可以使用 HTTP 服务下载
# 先安装 HTTP 服务组件
yum install -y httpd
# 关闭防火墙,因为这个服务器只是用来下载工具的,用完就删了,没必要在意安全问题
systemctl stop filewalld
# 直接打开 HTTP 服务,无需配置,默认 80 端口
systemctl start httpd
# 这是 HTTP 默认访问文件路径
cd /var/www/html
# 创建一个临时目录用于下载文件
mkdir test && cd test
# 复制之前先打个包,一共 3.3g
cp Ck压缩文件 ./
# 在本机访问地址 http://ipAddress:port/test 就可以在网页上看到文件,点击下载即可,这里还是需要在本机开个代理,要不还是很慢
# 下载下来后解压
tar -xzvf ClickHouse.tar.gz

准备编译操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 进入已经下载好依赖的 ClickHouse 的目录
cd ClickHouse

# 修改 CMakeLists 编译选项
vim CMakeLists.txt

# 在第一行添加以下配置,防止 Could NOT find Threads (missing: Threads_FOUND) 报错
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)

# 进入 vim 的命令模式(退出输入模式)输入:/if (WERROR) 找到该行,做如下操作
# 注释掉如下三行命令,禁止将警告作为错误报出
option (WERROR "Enable -Werror compiler option" OFF)
#if (WERROR)
# add_warning(error)
#endif ()

# 找到 set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=native") 这一行,修改为
set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=armv8-a")

# 保存退出

坑2:修改 ClickHouse/contrib/zlib-ng/CMakeLists.txt 文件:

这个文件也需要修改,要不然会在编译阶段出现报错,根据报错信息,最终定位到这个文件

1
2
3
# 在 ClickHouse 源码目录下
vim contrib/zlib-ng/CMakeLists.txt
# 把所有带有 -march 的地方都改成 -march=armv8-a

开始编译安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 开始编译时建议把整个 ClickHouse 文件目录放到一个比较空的磁盘,最好别是系统盘,因为编译过程中会产生 60g 的文件
# 在 ClickHouse 目录下执行命令
export CC=gcc; export CXX=g++; rm -rf build; mkdir -p build && cd build; cmake .. -DENABLE_TCMALLOC=OFF -DENABLE_JEMALLOC=OFF -DCMAKE_INSTALL_PREFIX=/opt/clickhouse

# 开 4 个进程进行编译(编译速度与 CPU,磁盘类型等因素有关,这里大概花了1个半小时)
make -j 4
make install

# 编译完成后会输出到 -DCMAKE_INSTALL_PREFIX 指定的目录,大概有 3.5g

# 添加环境变量
export PATH=/disk/data01/install-pkg/clickhouse/bin:${PATH}
export LD_LIBRARY_PATH=/disk/data01/install-pkg/clickhouse/lib:${LD_LIBRARY_PATH}

-DCMAKE_INSTALL_PREFIX 是安装目录

添加缺失文件:

在编译完成后,会缺少一些文件,并不是编译错误造成的,这些文件需要手动添加

  • config.xml
  • dhparam.pem
  • server.crt
  • server.key
  • users.xml

config.xml 和 users.xml 文件是从源码目录复制过来的

1
2
3
4
5
6
mkdir cliclhouse/config
cp ClickHouse/programs/server/config.xml cliclhouse/config/
cp ClickHouse/programs/server/users.xml cliclhouse/config/

# 验证是否安装成功
clickhouse-server --version

附上编译成功后的包

链接 —— 提取码:9y2u

引用:

鲲鹏(ARM64) ClickHouse20.5.1.1 EulerOS2.8移植指南

CentOS7 编译升级GCC至9.3.0

ARM服务器编译安装ClickHouse