簡介
-
ClickHouse是“戰(zhàn)斗民族”俄羅斯搜索巨頭Yandex公司開源的一個極具"戰(zhàn)斗力"的實時數(shù)據(jù)分析數(shù)據(jù)庫厦幅,是面向 OLAP 的分布式列式DBMS,圈內(nèi)人戲稱為“喀秋莎數(shù)據(jù)庫”函似。ClickHouse有一個簡稱"CK",與Hadoop到忽、Spark這些巨無霸組件相比聪全,ClickHouse很輕量級,其特點:
- 列式存儲數(shù)據(jù)庫载佳,數(shù)據(jù)壓縮
- 關(guān)系型、支持SQL
- 分布式并行計算臀栈,把單機性能壓榨到極限
- 高可用
- 數(shù)據(jù)量級在PB級別
- 實時數(shù)據(jù)更新
- 索引
-
ClickHouse最大的特點就是快蔫慧,快,快权薯,重要的話說三遍姑躲。為啥這樣快呢?
- 優(yōu)秀的代碼編寫盟蚣,強?的底層優(yōu)化黍析,嚴(yán)格的單元測試,內(nèi)置300多個函數(shù)
- A vector engine & Code generation
- CPU底層指令集的使?
- C++新特性
clickHouse數(shù)據(jù)以列式存儲屎开,具有強悍的數(shù)據(jù)聚合和并行處理能力阐枣。業(yè)界已經(jīng)有不少成功的例子,比如新浪奄抽。最近在試用clickHouse蔼两,首先需要從源碼編譯一個clickHouse。本文主要記敘編譯過程中的一些問題和解決方式逞度。
安裝的過程中额划,為了不污染全局環(huán)境,需要安裝的輔助軟件以及編譯環(huán)境档泽,都是在用戶自己的目錄下安裝的俊戳。
本來編譯一個源代碼揖赴,不需要寫什么文檔,但是clickHouse是我到目前位置編譯過最難的源碼抑胎,沒有之一燥滑,需要寫一個文檔記錄其中遇到的問題和解決辦法。這里只簡單記錄解決辦法圆恤,解決問題的過程太過復(fù)雜突倍,而且很多都繞彎,在此不再詳細(xì)描述盆昙。
參考:https://www.csdn.net/article/2018-01-14/2826786-ClickHouse
編譯環(huán)境
- 需要最新版的GCC 7羽历,ClickHouse對編譯環(huán)境比較挑剔,最新版的ClickHouse需要用最新版的GCC淡喜,我用的GCC 7也是用源碼安裝的秕磷,安裝到自己的目錄,而不是機器公共的目錄炼团,因為GCC的安裝涉及C庫的更新澎嚣,我所用的是開發(fā)機,不能影響其他人的使用瘟芝,各種路徑的配置如下易桃,熟悉GCC安裝的朋友可以略過:
gcc_path=/data1/home_jencoldeng/gcc_7
export PATH=$gcc_path/bin:${third}/bin:${PATH}
export C_INCLUDE_PATH=/usr/local/include/:${C_INCLUDE_PATH}
export CPLUS_INCLUDE_PATH=${gcc_path}/local/include/c++/6.2.0/:$CPLUS_INCLUDE_PATH
export LD_LIBRARY_PATH=$gcc_path/lib64:$gcc_path/lib:/usr/lib:${LD_LIBRARY_PATH}
export CXX=${gcc_path}/bin/g++
export CC=${gcc_path}/bin/gcc
- 程序主要源碼來自 https://github.com/yandex/ClickHouse,取當(dāng)前最新的穩(wěn)定版本v18.6.0锌俱,2天前晤郑,也就是2018.07.31才發(fā)布的版本。
- 其他需要的第三方庫會在編譯過程中提及贸宏。
下載第三方庫
- 在github上下載發(fā)布版造寝,得到文件
v18.5.1-stable.tar.gz
,解壓得到文件夾ClickHouse-18.5.1-stable
吭练。 - 打開隱藏文件
.gitmodules
诫龙,得到所依賴的第三方庫列表。
[submodule "contrib/poco"]
path = contrib/poco
url = https://github.com/ClickHouse-Extras/poco
[submodule "contrib/zstd"]
path = contrib/zstd
url = https://github.com/facebook/zstd.git
[submodule "contrib/lz4"]
path = contrib/lz4
url = https://github.com/lz4/lz4.git
[submodule "contrib/librdkafka"]
path = contrib/librdkafka
url = https://github.com/edenhill/librdkafka.git
[submodule "contrib/cctz"]
path = contrib/cctz
url = https://github.com/google/cctz.git
[submodule "contrib/zlib-ng"]
path = contrib/zlib-ng
url = https://github.com/Dead2/zlib-ng.git
[submodule "contrib/googletest"]
path = contrib/googletest
url = https://github.com/google/googletest.git
[submodule "contrib/capnproto"]
path = contrib/capnproto
url = https://github.com/capnproto/capnproto.git
[submodule "contrib/double-conversion"]
path = contrib/double-conversion
url = https://github.com/google/double-conversion.git
[submodule "contrib/re2"]
path = contrib/re2
url = https://github.com/google/re2.git
[submodule "contrib/ssl"]
path = contrib/ssl
url = https://github.com/ClickHouse-Extras/ssl.git
[submodule "contrib/boost"]
path = contrib/boost
url = https://github.com/ClickHouse-Extras/boost.git
[submodule "contrib/llvm"]
path = contrib/llvm
url = https://github.com/ClickHouse-Extras/llvm
- 如果編譯機可以聯(lián)網(wǎng)鲫咽,可以使用
git submodule update
等命令下載相關(guān)依賴項签赃,但是可能是因為這個是release包,命令執(zhí)行失敗分尸,所以不采用這個方式姊舵,采用下面的方式手動逐個下載,這種方法普適性更強寓落。 - 如果編譯機無法聯(lián)網(wǎng)括丁,可以根據(jù)第三方庫上的清單,自行下載伶选,放到contrib目錄下史飞,或建立相關(guān)軟鏈尖昏,可以參考如下腳本下載:
mkdir third
cd third
cat ../ClickHouse-18.5.1-stable/.gitmodules | grep url| awk '{print $NF}' | while read s;
do
echo "=====$s====";
git clone $s;
done
- 把第三方庫放入
ClickHouse-18.5.1-stable/contrib
目錄下,這個目錄下的第三方庫都是空目錄构资,可以直接mv
進去抽诉,或者建立軟鏈,略過不表吐绵。
開始編譯生成Makefile文件
- 在
ClickHouse-18.5.1-stable
下建立一個build
目錄迹淌,作為CMake的編譯目錄。 - 執(zhí)行編譯命令
cd ClickHouse-18.5.1-stable/build
p=/data1/home_jencoldeng/clickhouse_V18/ClickHouse_install #安裝目錄
cmake .. -DCMAKE_INSTALL_PREFIX=$p
- 下面開始處理編譯過程中出現(xiàn)的各種錯誤己单,注意每一次錯誤唉窃,需要重新編譯的話,都需要把build里面的文件清空(理論上只需要把
CMakeCache.txt
刪掉就可以了纹笼,但我是每次都清空)纹份。
CMake錯誤1:無法找到PCRE庫
-
pcre庫不在第三方庫列表中,所以需要額外安裝:
- 下載地址:http://www.pcre.org/廷痘,安裝過程不再贅述蔓涧,注意需要的是pcre,不是pcre2笋额,我就是因為圖方便元暴,直接下拉到最下面,用最新的一個兄猩,誰知道下載到的是pcre2茉盏,不適用
- 安裝完成之后,修改
CMakeLists.txt
文件厦滤,把安裝路徑加入到庫和頭文件的搜索路徑援岩,下面這幾行代碼添加到最前面歼狼。當(dāng)然掏导,有更熟悉CMake的朋友可以使用定義宏的方式,我就隨便使用一種方法了羽峰。
set(PCRE_INCLUDE_PATH,
"/data1/home_jencoldeng/clickhouse_V18/third/install/include")
set(PCRE_LIB_PATH,
"/data1/home_jencoldeng/clickhouse_V18/third/install/lib")
list(APPEND, CMAKE_INCLUDE_PATH, PCRE_INCLUDE_PATH)
list(APPEND, CMAKE_LIBRARY_PATH, PCRE_LIB_PATH)
CMake錯誤2:沒有找到expat庫
-
沒有找到expat庫趟咆,這是一個XML解析庫,POCO庫需要用到它:
下載地址:https://libexpat.github.io/梅屉,下載并安裝值纱,為了簡單,所有第三方庫安裝在同一個路徑中坯汤,也就是安裝在上面pcre的路徑中虐唠,就不需要重復(fù)添加路徑。
注意惰聂,這里默認(rèn)只生成動態(tài)庫疆偿,但是為了減少部署時帶來的困難咱筛,所以把它修改為生成靜態(tài)庫,讓ClickHouse靜態(tài)鏈接這個庫杆故。方法是在生成libexpat庫的時候迅箩,使用以下命令:
# $p是需要安裝的路徑,避免污染全局環(huán)境所以安裝在自己的目錄下
# BUILD_shared是一個選項处铛,表示是否生成共享庫
cmake -DBUILD_shared=OFF -DCMAKE_INSTALL_PREFIX=$p && make -j 8 && make install
CMake錯誤3:沒有找到zlib庫
-
沒有找到zlib庫
-
修改
contrib/CMakeLists.txt
饲趋,把CMAKE_DISABLE_FIND_PACKAGE_ZLIB標(biāo)志位設(shè)置為0,讓他從標(biāo)準(zhǔn)路徑上查找撤蟆,如圖:
CMake錯誤4:lz4編譯有問題
-
找不到頭文件
可能是lz4的版本問題奕塑,找一個舊版本,如
lz4-1.8.0
枫疆,放入contrib
目錄(直接代替或者軟鏈)爵川。至此,CMake成功通過息楔。
關(guān)于Makefile編譯
- ClickHouse的代碼和第三方庫非常巨大寝贡,所以我每次都是使用
make -j 20
來編譯,也就是最多20個進程同時編譯值依。并發(fā)進程數(shù)依賴于機器的性能圃泡。 - CPP代碼編譯慢,所以需要多進程同事進行愿险。
Makefile錯誤1:zstd編譯錯
-
zstd編譯不通過:Error: no such instruction
根據(jù)經(jīng)驗衡奥,出現(xiàn)這個原因是因為平臺優(yōu)化的選項打開了,按照網(wǎng)上的做法歹啼,把GCC平臺優(yōu)化
-march
關(guān)閉就可以了骨稿,但是關(guān)閉后問題仍然無法解決(也可能是我修改的地方不太對,我對CMake并不十分熟悉)扮叨,最后只要采用一個稍為舊的版本缤弦,如zstd-1.3.3
。
Makefile錯誤2:zlib編譯出錯
-
zlib編譯出錯:數(shù)據(jù)類型未定義
看起來應(yīng)該是頭文件沒有include彻磁,類型沒有定義碍沐,在
contrib/zlib-ng/zlib.h
加上如下定義
#include <stdarg.h>
#ifndef z_off64_t
# define z_off64_t off64_t
#endif
- 注意字段長度應(yīng)該是64位,不要搞錯長度衷蜓,避免運行時出現(xiàn)問題累提,這樣的話問題非常難以定位。
Makefile錯誤3:Boost連接錯誤
-
一大堆boost連接錯誤磁浇,主要的問題是
undefined reference to
boost::system::system_category()`斋陪,圖中只是冰山一角:
網(wǎng)上資料說,添加上需要的庫
-lboost_system
即可解決經(jīng)過查看
CMakeList.txt
,發(fā)現(xiàn)這個是測試功能无虚,也就是說鞍匾,可以不需要,因此修改CMakeLists.txt
文件骑科,查找ENABLE_TESTS
和TEST_COVERAGE
橡淑,把測試功能全部屏蔽。高手可以通過修改
CMakeList.txt
解決咆爽。
編譯成功
- 從這里看出梁棠,ClickHouse的二進制文件把所有可以靜態(tài)鏈接的庫都已經(jīng)連接進去了,甚至連CPP庫都靜態(tài)連接了斗埂,部署的時候應(yīng)該不難符糊。
$ ldd bin/clickhouse
linux-vdso.so.1 => (0x00007fffe6fe2000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x0000003a46800000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x0000003a45400000)
libz.so.1 => /lib64/libz.so.1 (0x0000003bb0a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003daa600000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003bafa00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003bafe00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003bb0600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003baf600000)
/lib64/ld-linux-x86-64.so.2 (0x0000003baf200000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x0000003a46000000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000003a45800000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003a44c00000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000003a45c00000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x0000003a46400000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003a45000000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003bb1a00000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a43c00000)
后記
- 編譯ClickHouse代碼,真是我遇到過最麻煩的代碼呛凶,各種依賴男娄,各種錯誤。
- 我對CMake方式編譯還真的不熟練漾稀,需要加強模闲。
- 后續(xù)會有對ClickHouse的相關(guān)測試,歡迎關(guān)注崭捍。