中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ClickHouse如何在windows下編譯調試

發布時間:2021-12-29 16:48:26 來源:億速云 閱讀:461 作者:柒染 欄目:數據安全

今天就跟大家聊聊有關ClickHouse如何在windows下編譯調試,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

什么是 ClickHouse

大數據時代,每一條數據都攜帶著一種信息,各種優傳感器,網關,IOT 設備無時無刻都在用日志輸出著自己的運行信息。這些信息被存儲后經過多維度計算就組成了我們現在的大數據環境。為了便于計算,出現了非常多優秀的數據庫及組件,他們都在自己擅長的領域解決著各種場景的問題,其中就有一款在 OLAP 場景下,以驚艷的性能指標橫空出世的數據庫, 這就是 ClickHouse 。
它是保守的俄羅斯一家商業公司 Yandex (類似中國的百度)在 2016 年開源的。今天我并不打算講解 ClickHouse 有什么特性,因為當你首先對這款數據庫感興趣時,有志者肯定第一想法是,“Talk is cheap, Show me the code。” 但對于大型工程,代碼下載是容易的,一些框架復雜,動態調用時才能清晰知道流程的項目,編譯出來調試一次,會對邏輯有更深的理解,也會降低閱讀難度,今天要講的便是如何編譯調試,尤其是在 windows 下利用強大的 Visual Studio 來調試 ClickHouse。

編譯準備

我先預設大家的水平都會知道一些基礎編譯信息,這里只做要求:

  1. WSL 或者 CentOS 7, 我習慣于在 windows 下減少虛擬機消耗,這兩者環境區別不大;

  2. GCC 7.4.0,ClickHouse 大量運用了 C++17 語法,要求編譯器版本為 7.4;

  3. cmake 3.14.5, 這個下載包直接解壓,建立軟鏈即可

  4. ninja 1.9.0, 直接下載對應包,解壓即可

  5. 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 模式。

修改 CMake 配置文件

修改根目錄下 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 庫,說明編譯成功!

創建 VS 工程

目前來講,我們應該有了全量代碼,很多模塊已經編成了 so 庫,我們現在要做的就是,添加一個 main.cpp 文件,調用接口跑起來我們關注的部分就成功了。

創建工程

在根目錄下創建 ClickHouse.sln, ClickHouse.vcxproj 兩個工程,工程類型為 Linux 工程,然后打開 VS 工程。如下圖:

ClickHouse如何在windows下編譯調試
注意:我用的是顯示所有文件視圖,并添加了一個 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 程序。

ClickHouse如何在windows下編譯調試

配置工程

配置頭文件

配置頭文件的列表,建議為編譯時看看頭文件在哪里,再添加進去,然后重復上面的動作直至全部添加為止。

配置鏈接庫


把編譯出來的庫文件添加進來。需要注意的是,這里的庫文件在存在于目標 linux 機器上。

調試運行

如果能如上圖斷點被命中,恭喜你,至此整個調試環境已經可以跑起來了!

調試技巧

當想要了解某一個模塊時,可以利用 VS 把想調試的源文件添加進工程中(默認是全部排除的),這時該文件會被 VS 自動拷貝到遠端,并參與到工程編譯中,此時就可以對該文件打斷點調試了。

結束

盡情利用源碼來探究 ClickHouse 吧,源碼面前沒有秘密!

看完上述內容,你們對ClickHouse如何在windows下編譯調試有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辉南县| 六安市| 泰兴市| 新龙县| 邳州市| 石门县| 巧家县| 常德市| 枣阳市| 旌德县| 宁国市| 山西省| 庆阳市| 揭阳市| 天长市| 土默特右旗| 合川市| 吕梁市| 汉寿县| 阿拉善左旗| 明星| 温宿县| 博兴县| 噶尔县| 烟台市| 古蔺县| 元江| 枣强县| 建平县| 蒙阴县| 宿松县| 曲阜市| 景宁| 浑源县| 青浦区| 依兰县| 县级市| 张家川| 孟州市| 高青县| 石河子市|