clickhouse介紹及架構(gòu)原理
ClickHouse 是俄羅斯的 Yandex 于 2016 年開源的列式存儲(chǔ)數(shù)據(jù)(DBMS),使用 C++語言編寫,主要用于在線分析處理查詢(OLAP),能夠使用 SQL 查詢實(shí)時(shí)生成分析數(shù)據(jù)報(bào)告
1)Parser與Interpreter
Parser和Interpreter是非常重要的兩組接口:Parser分析器是將sql語句已遞歸的方式形成AST語法樹的形式,并且不同類型的sql都會(huì)調(diào)用不同的parse實(shí)現(xiàn)類。而Interpreter解釋器則負(fù)責(zé)解釋AST,并進(jìn)一步創(chuàng)建查詢的執(zhí)行管道。Interpreter解釋器的作用就像Service服務(wù)層一樣,起到串聯(lián)整個(gè)查詢過程的作用,它會(huì)根據(jù)解釋器的類型,聚合它所需要的資源。首先它會(huì)解析AST對(duì)象;然后執(zhí)行"業(yè)務(wù)邏輯" ( 例如分支判斷、設(shè)置參數(shù)、調(diào)用接口等 );最終返回IBlock對(duì)象,以線程的形式建立起一個(gè)查詢執(zhí)行管道。
2)表引擎
表引擎是ClickHouse的一個(gè)顯著特性,上文也有提到,clickhouse有很多種表引擎。不同的表引擎由不同的子類實(shí)現(xiàn)。表引擎是使用IStorage接口的,該接口定義了DDL ( 如ALTER、RENAME、OPTIMIZE和DROP等 ) 、read和write方法,它們分別負(fù)責(zé)數(shù)據(jù)的定義、查詢與寫入。
3)DataType
數(shù)據(jù)的序列化和反序列化工作由DataType負(fù)責(zé)。根據(jù)不同的數(shù)據(jù)類型,IDataType接口會(huì)有不同的實(shí)現(xiàn)類。DataType雖然會(huì)對(duì)數(shù)據(jù)進(jìn)行正反序列化,但是它不會(huì)直接和內(nèi)存或者磁盤做交互,而是轉(zhuǎn)交給Column和Filed處理。
4)Column與Field
Column和Field是ClickHouse數(shù)據(jù)最基礎(chǔ)的映射單元。作為一款百分之百的列式存儲(chǔ)數(shù)據(jù)庫,ClickHouse按列存儲(chǔ)數(shù)據(jù),內(nèi)存中的一列數(shù)據(jù)由一個(gè)Column對(duì)象表示。Column對(duì)象分為接口和實(shí)現(xiàn)兩個(gè)部分,在IColumn接口對(duì)象中,定義了對(duì)數(shù)據(jù)進(jìn)行各種關(guān)系運(yùn)算的方法,例如插入數(shù)據(jù)的insertRangeFrom和insertFrom方法、用于分頁的cut,以及用于過濾的filter方法等。而這些方法的具體實(shí)現(xiàn)對(duì)象則根據(jù)數(shù)據(jù)類型的不同,由相應(yīng)的對(duì)象實(shí)現(xiàn),例如ColumnString、ColumnArray和ColumnTuple等。在大多數(shù)場(chǎng)合,ClickHouse都會(huì)以整列的方式操作數(shù)據(jù),但凡事也有例外。如果需要操作單個(gè)具體的數(shù)值 ( 也就是單列中的一行數(shù)據(jù) ),則需要使用Field對(duì)象,F(xiàn)ield對(duì)象代表一個(gè)單值。與Column對(duì)象的泛化設(shè)計(jì)思路不同,F(xiàn)ield對(duì)象使用了聚合的設(shè)計(jì)模式。在Field對(duì)象內(nèi)部聚合了Null、UInt64、String和Array等13種數(shù)據(jù)類型及相應(yīng)的處理邏輯。
5)Block
ClickHouse內(nèi)部的數(shù)據(jù)操作是面向Block對(duì)象進(jìn)行的,并且采用了流的形式。雖然Column和Filed組成了數(shù)據(jù)的基本映射單元,但對(duì)應(yīng)到實(shí)際操作,它們還缺少了一些必要的信息,比如數(shù)據(jù)的類型及列的名稱。于是ClickHouse設(shè)計(jì)了Block對(duì)象,Block對(duì)象可以看作數(shù)據(jù)表的子集。Block對(duì)象的本質(zhì)是由數(shù)據(jù)對(duì)象、數(shù)據(jù)類型和列名稱組成的三元組,即Column、DataType及列名稱字符串。Column提供了數(shù)據(jù)的讀取能力,而DataType知道如何正反序列化,所以Block在這些對(duì)象的基礎(chǔ)之上實(shí)現(xiàn)了進(jìn)一步的抽象和封裝,從而簡(jiǎn)化了整個(gè)使用的過程,僅通過Block對(duì)象就能完成一系列的數(shù)據(jù)操作。在具體的實(shí)現(xiàn)過程中,Block并沒有直接聚合Column和DataType對(duì)象,而是通過ColumnWith TypeAndName對(duì)象進(jìn)行間接引用。
Clickhouse應(yīng)用場(chǎng)景
自從ClickHouse2016年6月15日開源后,ClickHouse中文社區(qū)隨后成立。中文開源組開始以易觀,??低?美團(tuán),新浪,京東,58,騰訊,酷狗音樂和俄羅斯開源社區(qū)等人員組成,隨著開源社區(qū)的不斷活躍,陸續(xù)有神州數(shù)碼,青云,PingCAP,中軟國際等公司成員加入以及其他公司成員加入。初始在群里討論技術(shù)后續(xù)有一些大型公司陸續(xù)運(yùn)用到項(xiàng)目中,介于分享不方便問題解決,建立了相應(yīng)的論壇。根據(jù)交流得知一些大公司已經(jīng)運(yùn)用。
最大的應(yīng)用來自于Yandex的統(tǒng)計(jì)分析服務(wù)Yandex.Metrica,類似于谷歌Analytics(GA),或友盟統(tǒng)計(jì),小米統(tǒng)計(jì),幫助網(wǎng)站或移動(dòng)應(yīng)用進(jìn)行數(shù)據(jù)分析和精細(xì)化運(yùn)營工具,據(jù)稱Yandex.Metrica為世界上第二大的網(wǎng)站分析平臺(tái)。ClickHouse在這個(gè)應(yīng)用中,部署了近四百臺(tái)機(jī)器,每天支持200億的事件和歷史總記錄超過13萬億條記錄,這些記錄都存有原始數(shù)據(jù)(非聚合數(shù)據(jù)),隨時(shí)可以使用SQL查詢和分析,生成用戶報(bào)告。
Clickhouse安裝
1)確定防火墻處于關(guān)閉狀態(tài)
2)CentOS 取消打開文件數(shù)限制
在 hadoop102 的 /etc/security/limits.conf 文件的末尾加入以下內(nèi)容
在 hadoop102 的/etc/security/limits.d/20-nproc.conf 文件的末尾加入以下內(nèi)容
執(zhí)行同步操作
4)CentOS 取消 SELINUX
修改/etc/selinux/config 中的 SELINUX=disabled
執(zhí)行同步操作
重啟三臺(tái)服務(wù)器。
把
機(jī)以外的服務(wù)器訪問
分發(fā)配置文件
sudo /home/atguigu/bin/xsync /etc/clickhouse-server/config.xml
在這個(gè)文件中,有 ClickHouse 的一些默認(rèn)路徑配置,比較重要的
數(shù)據(jù)文件路徑:
日志文件路徑:
Clickhouse為什么做查詢分析那么快
Clickhouse為什么做查詢分析那么快?
因?yàn)閏lickhouse使用了下列方案:
所有的OLAP技術(shù),基本都是使用的列式存儲(chǔ)。其有以下優(yōu)點(diǎn):
分析場(chǎng)景中往往需要讀大量行但是少量列。在行存儲(chǔ)模式中,所有的列數(shù)據(jù)都存儲(chǔ)在一個(gè)block中,不參與計(jì)算的列在IO的時(shí)候也需要讀取,造成沒必要的IO浪費(fèi)。而列式存儲(chǔ),則只需要讀取參與計(jì)算的列即可,極大的減少了IO消耗,加快了查詢效率同一列數(shù)據(jù)中的數(shù)據(jù)類型相同,這有利于提高壓縮比,節(jié)省大量存儲(chǔ)空間而壓縮比高,則意味著數(shù)據(jù)體積小,對(duì)應(yīng)的其IO讀取耗時(shí)更短
自由壓縮算法選擇,不同的列可以根據(jù)數(shù)據(jù)類型,來使用不同的壓縮算法高壓縮比,同時(shí)也會(huì)減少內(nèi)存消耗,同樣的內(nèi)存可以緩存更多的數(shù)據(jù)
關(guān)于數(shù)據(jù)壓縮:Clickhouse的數(shù)據(jù)存儲(chǔ)文件 column.bin中存儲(chǔ)的是一列數(shù)據(jù),由于一列是相同的數(shù)據(jù)類型,所以方便高效壓縮,在進(jìn)行壓縮的時(shí)候,請(qǐng)注意:一個(gè)壓縮數(shù)據(jù)塊由頭信息和壓縮數(shù)據(jù)兩部分組成,頭信息固定使用9位字節(jié)表示,具體由1個(gè)UInt8(1字節(jié))整型和2個(gè)UInt32(4字節(jié))整型組成,分別代表使用的壓縮算法類型、壓縮后的數(shù)據(jù)大小和壓縮前的數(shù)據(jù)大小。每個(gè)壓縮數(shù)據(jù)塊的體積,按照其壓縮前的數(shù)據(jù)字節(jié)大小,都被嚴(yán)格控制在64KB ~ 1MB,其上下限分別由 min_compress-block_size(默認(rèn)65535=64KB)與max_compress_block_size(默認(rèn)1MB)參數(shù)指定。
具體壓縮規(guī)則:
單個(gè)批次數(shù)據(jù) size < 64KB:如果單個(gè)批次數(shù)據(jù)小于64KB,則繼續(xù)獲取下一批數(shù)據(jù)后,直至累計(jì)到size >= 64KB時(shí),生成下一個(gè)壓縮數(shù)據(jù)塊。如果平均每條記錄小于8byte,多個(gè)數(shù)據(jù)批次壓縮成一個(gè)數(shù)據(jù)塊
單個(gè)批次數(shù)據(jù) 64KB <= size <= 1MB:如果單個(gè)批次數(shù)據(jù)大小在64KB與1MB之間,則直接生成下一個(gè)壓縮數(shù)據(jù)塊
> 單個(gè)批次數(shù)據(jù) size > 1MB:如果單個(gè)批次數(shù)據(jù)直接超過1MB,則首先按照1MB大小截?cái)嗖⑸上乱粋€(gè)壓縮數(shù)據(jù)塊。剩余數(shù)據(jù)繼續(xù)依照上述規(guī)則執(zhí)行。此時(shí),會(huì)出現(xiàn)一個(gè)批次數(shù)據(jù)生成多個(gè)壓縮數(shù)據(jù)塊的情況。如果平均每條記錄的大小超過128byte,則會(huì)把當(dāng)前這一個(gè)批次的數(shù)據(jù)壓縮成多個(gè)數(shù)據(jù)塊
關(guān)于數(shù)據(jù)標(biāo)記,數(shù)據(jù)標(biāo)記文件也與xxx.bin文件一一對(duì)應(yīng),是一級(jí)索引與數(shù)據(jù)塊之間關(guān)系的數(shù)據(jù)
更多精彩干貨分享
點(diǎn)擊下方名片關(guān)注
IT那活兒
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/129789.html
摘要:利用快速構(gòu)建系統(tǒng)。構(gòu)建系統(tǒng)和的安裝本文不再贅述,直接開始動(dòng)手構(gòu)建系統(tǒng)。分別為和,用于讀寫組,用于只讀組。最后配置的監(jiān)控服務(wù)可選,非必須至此,一個(gè)全部基于開源應(yīng)用的簡(jiǎn)易系統(tǒng)就構(gòu)建好了。利用ProxySQL、MySQL、ClickHouse快速構(gòu)建HTAP系統(tǒng)。1. 關(guān)于ClickHouse企業(yè)里隨著數(shù)據(jù)量的增加,以及日趨復(fù)雜的分析性業(yè)務(wù)需求,主要適用于OLTP場(chǎng)景的MySQL壓力越來越大。多年...
摘要:前言在資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。支持諸多輸出,稱為。所以本文主要講如何為增加。實(shí)際上,基于增加并且更改,也可以做到,只不過需要裝一些包指令,結(jié)果就是鏡像變大。實(shí)際運(yùn)行日志截圖由于的出色的寫入性能,運(yùn)行非常穩(wěn)定。 前言 在k8s資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。相對(duì)虛機(jī)來講,容器不容易實(shí)現(xiàn)。資源指標(biāo)收集可以采用heapster,也可以用prometheus。之前文...
摘要:前言在資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。支持諸多輸出,稱為。所以本文主要講如何為增加。實(shí)際上,基于增加并且更改,也可以做到,只不過需要裝一些包指令,結(jié)果就是鏡像變大。實(shí)際運(yùn)行日志截圖由于的出色的寫入性能,運(yùn)行非常穩(wěn)定。 前言 在k8s資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。相對(duì)虛機(jī)來講,容器不容易實(shí)現(xiàn)。資源指標(biāo)收集可以采用heapster,也可以用prometheus。之前文...
閱讀 1459·2023-01-11 13:20
閱讀 1815·2023-01-11 13:20
閱讀 1267·2023-01-11 13:20
閱讀 2006·2023-01-11 13:20
閱讀 4227·2023-01-11 13:20
閱讀 2885·2023-01-11 13:20
閱讀 1489·2023-01-11 13:20
閱讀 3814·2023-01-11 13:20