今天就跟大家聊聊有關(guān)ClickHouse如何在windows下編譯調(diào)試,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到桐廬網(wǎng)站設(shè)計與桐廬網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋桐廬地區(qū)。
大數(shù)據(jù)時代,每一條數(shù)據(jù)都攜帶著一種信息,各種優(yōu)傳感器,網(wǎng)關(guān),IOT 設(shè)備無時無刻都在用日志輸出著自己的運行信息。這些信息被存儲后經(jīng)過多維度計算就組成了我們現(xiàn)在的大數(shù)據(jù)環(huán)境。為了便于計算,出現(xiàn)了非常多優(yōu)秀的數(shù)據(jù)庫及組件,他們都在自己擅長的領(lǐng)域解決著各種場景的問題,其中就有一款在 OLAP 場景下,以驚艷的性能指標橫空出世的數(shù)據(jù)庫, 這就是 ClickHouse 。
它是保守的俄羅斯一家商業(yè)公司 Yandex (類似中國的百度)在 2016 年開源的。今天我并不打算講解 ClickHouse 有什么特性,因為當你首先對這款數(shù)據(jù)庫感興趣時,有志者肯定第一想法是,“Talk is cheap, Show me the code?!?但對于大型工程,代碼下載是容易的,一些框架復(fù)雜,動態(tài)調(diào)用時才能清晰知道流程的項目,編譯出來調(diào)試一次,會對邏輯有更深的理解,也會降低閱讀難度,今天要講的便是如何編譯調(diào)試,尤其是在 windows 下利用強大的 Visual Studio 來調(diào)試 ClickHouse。
我先預(yù)設(shè)大家的水平都會知道一些基礎(chǔ)編譯信息,這里只做要求:
WSL 或者 CentOS 7, 我習(xí)慣于在 windows 下減少虛擬機消耗,這兩者環(huán)境區(qū)別不大;
GCC 7.4.0,ClickHouse 大量運用了 C++17 語法,要求編譯器版本為 7.4;
cmake 3.14.5, 這個下載包直接解壓,建立軟鏈即可
ninja 1.9.0, 直接下載對應(yīng)包,解壓即可
Visual Studio, 我用的是 VS2019
盡量在 linux 環(huán)境下(包括 WSL)使用 git 下載,應(yīng)該 ClickHouse 引用了很多外部開源工程,在拉取過程中有些源文件是會建立軟鏈接的,如果在 windows 下,這些軟鏈接會建立失敗,導(dǎo)致后期編譯時錯誤。也不用直接在 git 上下載源碼包,這樣外部引用的開源工程都不會被拉取,造成編譯不過。
// 拉取 git clone --recursive https://github.com/yandex/ClickHouse.git cd ClickHouse // 切換到 19.7 分支,或者一開始只拉取該分支代碼 git tag -l git checkout v19.7.3.9-stable
mkdir build cd build cmake .. ninja clickhouse
dbms/programs/clickhouse server -V ClickHouse server version 19.7.3.1
如果出現(xiàn)上面結(jié)果,那么你已經(jīng)成功了。
但,還沒有達到我們的目的,我們是需要在 windows 下調(diào)試起來。
由于默認情況下,ClickHouse 是編譯成靜態(tài)模塊,打包成一個大程序。為了便于后期更改代碼調(diào)試時減少鏈接時間,我們修改為編譯為動態(tài)鏈接庫的形式,這樣也可以逐模塊探索。還有,默認情況下,ClickHouse 是非 DEBUG 模式的,由于在內(nèi)存管理這塊,在 DEBUG 和非 DEBUG 模塊下啟用的是不同算法。我們打算非調(diào)試的模塊依然用 ninja 調(diào)用 gcc 這一套編譯成 so 庫,在需要修改的代碼處用 Visual Studio 編譯,而 Visual Studio 在調(diào)試時,一般會是 DEBUG 模塊,所以其它模塊(ninja)在編譯時,我們預(yù)先改成 DEBUG 模式。
修改根目錄下 CMakeLists.txt, USE_STATIC_LIBRARIES 為 FALSE。
option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" FALSE)
mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Debug ninja -j 4
如果在 build/dbms 下面出現(xiàn)了 libdbmsd.so 庫,說明編譯成功!
目前來講,我們應(yīng)該有了全量代碼,很多模塊已經(jīng)編成了 so 庫,我們現(xiàn)在要做的就是,添加一個 main.cpp 文件,調(diào)用接口跑起來我們關(guān)注的部分就成功了。
在根目錄下創(chuàng)建 ClickHouse.sln, ClickHouse.vcxproj 兩個工程,工程類型為 Linux 工程,然后打開 VS 工程。如下圖:
注意:我用的是顯示所有文件視圖,并添加了一個 main.cpp 文件, 代碼如下,也是 Parser 下的測試用例。
#include#include #include #include int main(int, char **) try { using namespace DB; std::string input = " SELECT 18446744073709551615, f(1), '\\\\', [a, b, c], (a, b, c), 1 + 2 * -3, a = b OR c > d.1 + 2 * -g[0] AND NOT e < f * (x + y)" " FROM default.hits" " WHERE CounterID = 101500 AND UniqID % 3 = 0" " GROUP BY UniqID" " HAVING SUM(Refresh) > 100" " ORDER BY Visits, PageViews" " LIMIT LENGTH('STRING OF 20 SYMBOLS') - 20 + 1000, 10.05 / 5.025 * 5" " INTO OUTFILE 'test.out'" " FORMAT TabSeparated"; ParserQueryWithOutput parser; ASTPtr ast = parseQuery(parser, input.data(), input.data() + input.size(), "", 0); std::cout << "Success." << std::endl; formatAST(*ast, std::cerr); std::cout << std::endl; return 0; } catch (...) { std::cerr << DB::getCurrentExceptionMessage(true) << "\n"; return 1; }
在 VS 的工具/選項下面配置一個遠程管理器,這是 VS 的一個特性,可以通過 ssh 調(diào)用遠端 gcc 和 gdb 用來編譯調(diào)試 linux 程序。
配置頭文件的列表,建議為編譯時看看頭文件在哪里,再添加進去,然后重復(fù)上面的動作直至全部添加為止。
把編譯出來的庫文件添加進來。需要注意的是,這里的庫文件在存在于目標 linux 機器上。
如果能如上圖斷點被命中,恭喜你,至此整個調(diào)試環(huán)境已經(jīng)可以跑起來了!
當想要了解某一個模塊時,可以利用 VS 把想調(diào)試的源文件添加進工程中(默認是全部排除的),這時該文件會被 VS 自動拷貝到遠端,并參與到工程編譯中,此時就可以對該文件打斷點調(diào)試了。
盡情利用源碼來探究 ClickHouse 吧,源碼面前沒有秘密!
看完上述內(nèi)容,你們對ClickHouse如何在windows下編譯調(diào)試有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。