Gluten github文档对于构建方法的配置流程基于Ubuntu 20系统,但企业Linux一般为CTyunOS/CentOS,且受国外网络访问限制。编译Gluten ClickHouseh会带来较为繁琐的构建编译工作。本文详解一种在CTyunOS构建和编译Gluten ClickHouseBE的方法。
概述
Gluten项目通过其Java Native Interface,使得基于Java的查询引擎可以利用本地加速库,如Intel的Velox库、Kyligence的ClickHouse库,来提高查询性能和效率。
ClickHouse是面向列的DBMS,用于在线分析处理查询(OLAP),同时通过使用列式存储和压缩,显著降低了存储需求,提升查询性能。Gluten项目
Gluten ClickHouse backend是通过把ClickHouse作为一个libch.so库,由JNI加载使CH作为本地引擎。这种方式不需要部署一个独立的ClickHouse集群;Spark的各个Executor启动时通过JNI加载libch.so库,并根据中间表示Substrait计划调用相应的operator(如读/写 scan, filter, aggregation,. ..)。
ClickHouse架构
Build Gluten with ClickHouse
Gluten github文档对于构建方法的配置流程基于Ubuntu 20系统。企业Linux一般为CTyunOS/CentOS,加之受网络原因限制,带来额外且繁琐的构建和部署工作。本节基于CTyunOS构建和编译Gluten ClickHouseBE。
准备
- cmake 3.20 or higher
- ninja-build 1.8.2
- Java 8
- Maven 3.6.3 or higher
官方文档对于Ubuntu的环境准备需运行位于gluten路径的./ep/build-clickhouse/src/install_ubuntu.sh yasm nasm两个汇编器需要安装。ClickHouse采用了clang作为编译器,Ubuntu下可直接执行h-t-t-p-s://apt.llvm.org/llvm.sh,检测release号并安装LLVM toolchain 16/17;CTyunOS/CentOS中此处是通过源码编译安装LLVM。此外,CTyunOS的依赖组件安装、源等 注意版本应对应CentOS 7.6。
源码编译build LLVM toolchain
事先需安装并建议使用gcc/g++用于编译LLVM项目源码。以安装LLVM-17为例:
1. 首先从llvm.org 下载完整源码tar llvm-project-17.0.2.src.tar.xz
# 选择合适解压路径,解压
tar -xf llvm-project-17.0.2.src.tar.xz
mv llvm-project-17.0.2.src llvm-src-17
cd llvm-src-17
# 编译LLVM build结果在build相关路径下
mkdir build
cd build
# 生成构建文件 注意ENABLE_PROJECTS不包含libc
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local/llvm-17 \
-DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;compiler-rt;lld;lldb;cross-project-tests;libclc;polly" \
-DLLVM_ENABLE_RUNTIMES=all ../llvm
在cmake编译预处理时,LLVM_ENABLE_PROJECTS包括了所需的clang及clang-tools-extra。注意LLVM_ENABLE_PROJECTS在官方文档 (3*w.llvm.org/docs/CMake.html) 的说明中有误,libc应属于LLVM_ENABLE_RUNTIMES的选项,此处演示均开启。本文使用了ninja作为编译工具,并手动指定安装位置。
# 编译
ninja
# 安装
ninja install
安装成功后,需要添加LLVM的执行文件至环境变量;此外为适配官方安装,将install_ubuntu.sh的CC, CXX指向clang编译器,如在~/.bashrc中添加,即为
export PATH=/usr/local/llvm-17/bin:$PATH
export CC=clang-17
export CXX=clang++-17
# $ source ~/.bashrc
# $ clang++-17 --version
# clang version 17.0.2
# Target: x86_64-unknown-linux-gnu
# Thread model: posix
# InstalledDir: /usr/local/llvm-17/bin
编译ClickHouse Backend
在/path/to/gluten路径下,执行
bash ./ep/build-clickhouse/src/build_clickhouse.sh
此脚本使用clang编译器、cmake ninja执行构建生成文件。其指定的构建位置位于${GLUTEN_SOURCE}/cpp-ch,依赖于gluten/cpp-ch下的CMakeLists.txt。
CMakeLists中:先检查有无ClickHouse源码(clickhouse_files),默认路径是gluten_path/cpp-ch/ClickHouse;若无clickhouse_files,则尝试拉取指定分支,或者文件存在时更新(可能变更的分支、版本等)。
在外网访问受限情况,拉取依赖会等待极长的时间或失败。一种可行方法是在另外可访问外网的机器拉取ClickHouse源码并上传至主机。其中需注意由于Gluten项目源码目前变更仍较频繁,且ClickHouse版本 (cpp-ch/clickhouse.version) 持续变化,需要保证gluten\ClickHouse源码最好不要交叉使用,否则编译报错。
ClickHouse源码就位后,即可将CMakeList.txt中对应依赖拉取的操作注释掉,具体可参考截图:
编译成功后生成libch.so位于/gluten_path/cpp-ch/build/utils/exter-local-engine/libch.so
编译Gluten
可直接按官方文档指令:
cd /path/to/gluten/
export MAVEN_OPTS="-Xmx8g -XX:ReservedCodeCacheSize=2g"
# for Spark 3.2.2
mvn clean install -Pbackends-clickhouse -Phadoop-2.7.4 -Pspark-3.2 -Dhadoop.version=2.8.5 -DskipTests\
-Dcheckstyle.skip
# for Spark 3.3.1
mvn clean install -Pbackends-clickhouse -Phadoop-2.7.4 -Pspark-3.3 -Dhadoop.version=2.8.5 -DskipTests\
-Dcheckstyle.skip
生成的jar包位于 gluten/backends-clickhouse/target/gluten-XXXXX-spark-3.x-jar-with-dependencies.jar
TPC-DS测试验证
Spark config可参考官方文档或自行调整。在测试机上本地放置libch.so,拷贝编译的gluten-ch.jar至${SPARK_HOME}/jars即可。测试配置项参考了Gluten in YARN cluster (github.com/oap-project/gluten/blob/main/docs/get-started/ClickHouse.md#gluten-in-yarn-cluster) 配置,并自行进行了调整。
结论
在CTyunOS/CentOS编译Gluten ClickHouse Backend时需手动安装各组件和依赖,对于外网访问问题采用提前下载源码并拷贝到相应路径的方式进行并跳过原有拉取操作完成编译。测试时在Spark INFO日志可查看Gluten Clickhouse编译版本,证明Spark Gluten Clickhouse启用。