您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關ClickHouse如何在windows下編譯調試,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
大數據時代,每一條數據都攜帶著一種信息,各種優傳感器,網關,IOT 設備無時無刻都在用日志輸出著自己的運行信息。這些信息被存儲后經過多維度計算就組成了我們現在的大數據環境。為了便于計算,出現了非常多優秀的數據庫及組件,他們都在自己擅長的領域解決著各種場景的問題,其中就有一款在 OLAP 場景下,以驚艷的性能指標橫空出世的數據庫, 這就是 ClickHouse 。
它是保守的俄羅斯一家商業公司 Yandex (類似中國的百度)在 2016 年開源的。今天我并不打算講解 ClickHouse 有什么特性,因為當你首先對這款數據庫感興趣時,有志者肯定第一想法是,“Talk is cheap, Show me the code。” 但對于大型工程,代碼下載是容易的,一些框架復雜,動態調用時才能清晰知道流程的項目,編譯出來調試一次,會對邏輯有更深的理解,也會降低閱讀難度,今天要講的便是如何編譯調試,尤其是在 windows 下利用強大的 Visual Studio 來調試 ClickHouse。
我先預設大家的水平都會知道一些基礎編譯信息,這里只做要求:
WSL 或者 CentOS 7, 我習慣于在 windows 下減少虛擬機消耗,這兩者環境區別不大;
GCC 7.4.0,ClickHouse 大量運用了 C++17 語法,要求編譯器版本為 7.4;
cmake 3.14.5, 這個下載包直接解壓,建立軟鏈即可
ninja 1.9.0, 直接下載對應包,解壓即可
Visual Studio, 我用的是 VS2019
盡量在 linux 環境下(包括 WSL)使用 git 下載,應該 ClickHouse 引用了很多外部開源工程,在拉取過程中有些源文件是會建立軟鏈接的,如果在 windows 下,這些軟鏈接會建立失敗,導致后期編譯時錯誤。也不用直接在 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
如果出現上面結果,那么你已經成功了。
但,還沒有達到我們的目的,我們是需要在 windows 下調試起來。
由于默認情況下,ClickHouse 是編譯成靜態模塊,打包成一個大程序。為了便于后期更改代碼調試時減少鏈接時間,我們修改為編譯為動態鏈接庫的形式,這樣也可以逐模塊探索。還有,默認情況下,ClickHouse 是非 DEBUG 模式的,由于在內存管理這塊,在 DEBUG 和非 DEBUG 模塊下啟用的是不同算法。我們打算非調試的模塊依然用 ninja 調用 gcc 這一套編譯成 so 庫,在需要修改的代碼處用 Visual Studio 編譯,而 Visual Studio 在調試時,一般會是 DEBUG 模塊,所以其它模塊(ninja)在編譯時,我們預先改成 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 下面出現了 libdbmsd.so 庫,說明編譯成功!
目前來講,我們應該有了全量代碼,很多模塊已經編成了 so 庫,我們現在要做的就是,添加一個 main.cpp 文件,調用接口跑起來我們關注的部分就成功了。
在根目錄下創建 ClickHouse.sln, ClickHouse.vcxproj 兩個工程,工程類型為 Linux 工程,然后打開 VS 工程。如下圖:
注意:我用的是顯示所有文件視圖,并添加了一個 main.cpp 文件, 代碼如下,也是 Parser 下的測試用例。
#include <iostream> #include <Parsers/ParserQueryWithOutput.h> #include <Parsers/parseQuery.h> #include <Parsers/formatAST.h> 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 調用遠端 gcc 和 gdb 用來編譯調試 linux 程序。
配置頭文件的列表,建議為編譯時看看頭文件在哪里,再添加進去,然后重復上面的動作直至全部添加為止。
把編譯出來的庫文件添加進來。需要注意的是,這里的庫文件在存在于目標 linux 機器上。
如果能如上圖斷點被命中,恭喜你,至此整個調試環境已經可以跑起來了!
當想要了解某一個模塊時,可以利用 VS 把想調試的源文件添加進工程中(默認是全部排除的),這時該文件會被 VS 自動拷貝到遠端,并參與到工程編譯中,此時就可以對該文件打斷點調試了。
盡情利用源碼來探究 ClickHouse 吧,源碼面前沒有秘密!
看完上述內容,你們對ClickHouse如何在windows下編譯調試有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。