Clickhouse v18編譯記錄

簡介

  • 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庫不在第三方庫列表中,所以需要額外安裝:


    無法找到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庫需要用到它:


    沒有找到expat庫
  • 下載地址: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庫


    沒有找到zlib庫
  • 修改contrib/CMakeLists.txt饲趋,把CMAKE_DISABLE_FIND_PACKAGE_ZLIB標(biāo)志位設(shè)置為0,讓他從標(biāo)準(zhǔn)路徑上查找撤蟆,如圖:

    image.png

CMake錯誤4:lz4編譯有問題

  • 找不到頭文件


    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


    zstd編譯錯
  • 根據(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ù)類型未定義


    zlib編譯出錯
  • 看起來應(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 toboost::system::system_category()`斋陪,圖中只是冰山一角:

    Boost連接錯誤

  • 網(wǎng)上資料說,添加上需要的庫-lboost_system即可解決

  • 經(jīng)過查看CMakeList.txt,發(fā)現(xiàn)這個是測試功能无虚,也就是說鞍匾,可以不需要,因此修改CMakeLists.txt文件骑科,查找ENABLE_TESTSTEST_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)注崭捍。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尸折,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子殷蛇,更是在濱河造成了極大的恐慌实夹,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粒梦,死亡現(xiàn)場離奇詭異亮航,居然都是意外死亡,警方通過查閱死者的電腦和手機匀们,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門缴淋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昼蛀,你說我怎么就攤上這事宴猾≡泊妫” “怎么了叼旋?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沦辙。 經(jīng)常有香客問我夫植,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任详民,我火速辦了婚禮延欠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沈跨。我一直安慰自己由捎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布饿凛。 她就那樣靜靜地躺著狞玛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涧窒。 梳的紋絲不亂的頭發(fā)上心肪,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音纠吴,去河邊找鬼硬鞍。 笑死,一個胖子當(dāng)著我的面吹牛戴已,可吹牛的內(nèi)容都是我干的固该。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼糖儡,長吁一口氣:“原來是場噩夢啊……” “哼蹬音!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起休玩,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤著淆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拴疤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體永部,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年呐矾,在試婚紗的時候發(fā)現(xiàn)自己被綠了苔埋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜒犯,死狀恐怖组橄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罚随,我是刑警寧澤玉工,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站淘菩,受9級特大地震影響遵班,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一狭郑、第九天 我趴在偏房一處隱蔽的房頂上張望腹暖。 院中可真熱鬧,春花似錦翰萨、人聲如沸脏答。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽以蕴。三九已至,卻和暖如春辛孵,著一層夾襖步出監(jiān)牢的瞬間丛肮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工魄缚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宝与,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓冶匹,卻偏偏與公主長得像习劫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嚼隘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容