ClickHouse深度揭秘

引言

ClickHouse是近年來(lái)備受關(guān)注的開(kāi)源列式數(shù)據(jù)庫(kù)絮爷,主要用于數(shù)據(jù)分析(OLAP)領(lǐng)域月洛。目前國(guó)內(nèi)社區(qū)火熱感挥,各個(gè)大廠紛紛跟進(jìn)大規(guī)模使用:

  • 今日頭條 內(nèi)部用ClickHouse來(lái)做用戶行為分析蒋伦,內(nèi)部一共幾千個(gè)ClickHouse節(jié)點(diǎn)溉知,單集群最大1200節(jié)點(diǎn),總數(shù)據(jù)量幾十PB娜膘,日增原始數(shù)據(jù)300TB左右逊脯。
  • 騰訊內(nèi)部用ClickHouse做游戲數(shù)據(jù)分析,并且為之建立了一整套監(jiān)控運(yùn)維體系竣贪。
  • 攜程內(nèi)部從18年7月份開(kāi)始接入試用军洼,目前80%的業(yè)務(wù)都跑在ClickHouse上。每天數(shù)據(jù)增量十多億贾富,近百萬(wàn)次查詢請(qǐng)求。
  • 快手內(nèi)部也在使用ClickHouse盗胀,存儲(chǔ)總量大約10PB, 每天新增200TB, 90%查詢小于3S惫确。

在國(guó)外,Yandex內(nèi)部有數(shù)百節(jié)點(diǎn)用于做用戶點(diǎn)擊行為分析懦窘,CloudFlare午衰、Spotify等頭部公司也在使用。

特別值得一提的是:國(guó)內(nèi)云計(jì)算的領(lǐng)導(dǎo)廠商 阿里云 率先推出了自己的ClickHouse托管產(chǎn)品迎献,產(chǎn)品首頁(yè)地址為 云數(shù)據(jù)庫(kù)ClickHouse,可以點(diǎn)擊鏈接申請(qǐng)參加免費(fèi)公測(cè)伴奥,一睹為快宾巍!

在社區(qū)方面,github star數(shù)目增速驚人渔伯。

image-20191217212708825.png

在DB-engines排名上顶霞,如下圖中紅色曲線所示。ClickHouse開(kāi)源時(shí)間雖短锣吼,但是增勢(shì)迅猛选浑。


image.png

為何ClickHouse獲得了如此廣泛的關(guān)注,得到了社區(qū)的青睞玄叠,也得到了諸多大廠的應(yīng)用呢古徒? 本文嘗試從技術(shù)視角進(jìn)行回答。

OLAP場(chǎng)景的特點(diǎn)

讀多于寫

不同于事務(wù)處理(OLTP)的場(chǎng)景读恃,比如電商場(chǎng)景中加購(gòu)物車隧膘、下單、支付等需要在原地進(jìn)行大量insert寺惫、update疹吃、delete操作,數(shù)據(jù)分析(OLAP)場(chǎng)景通常是將數(shù)據(jù)批量導(dǎo)入后西雀,進(jìn)行任意維度的靈活探索萨驶、BI工具洞察、報(bào)表制作等艇肴。數(shù)據(jù)一次性寫入后腔呜,分析師需要嘗試從各個(gè)角度對(duì)數(shù)據(jù)做挖掘、分析再悼,直到發(fā)現(xiàn)其中的商業(yè)價(jià)值核畴、業(yè)務(wù)變化趨勢(shì)等信息。這是一個(gè)需要反復(fù)試錯(cuò)冲九、不斷調(diào)整谤草、持續(xù)優(yōu)化的過(guò)程,其中數(shù)據(jù)的讀取次數(shù)遠(yuǎn)多于寫入次數(shù)娘侍。這就要求底層數(shù)據(jù)庫(kù)為這個(gè)特點(diǎn)做專門設(shè)計(jì)咖刃,而不是盲目采用傳統(tǒng)數(shù)據(jù)庫(kù)的技術(shù)架構(gòu)。

大寬表憾筏,讀大量行但是少量列嚎杨,結(jié)果集較小

在OLAP場(chǎng)景中,通常存在一張或是幾張多列的大寬表氧腰,列數(shù)高達(dá)數(shù)百甚至數(shù)千列枫浙。對(duì)數(shù)據(jù)分析處理時(shí)刨肃,選擇其中的少數(shù)幾列作為維度列、其他少數(shù)幾列作為指標(biāo)列箩帚,然后對(duì)全表或某一個(gè)較大范圍內(nèi)的數(shù)據(jù)做聚合計(jì)算真友。這個(gè)過(guò)程會(huì)掃描大量的行數(shù)據(jù),但是只用到了其中的少數(shù)列紧帕。而聚合計(jì)算的結(jié)果集相比于動(dòng)輒數(shù)十億的原始數(shù)據(jù)盔然,也明顯小得多。

數(shù)據(jù)批量寫入是嗜,且數(shù)據(jù)不更新或少更新

OLTP類業(yè)務(wù)對(duì)于延時(shí)(Latency)要求更高愈案,要避免讓客戶等待造成業(yè)務(wù)損失;而OLAP類業(yè)務(wù)鹅搪,由于數(shù)據(jù)量非常大站绪,通常更加關(guān)注寫入吞吐(Throughput),要求海量數(shù)據(jù)能夠盡快導(dǎo)入完成丽柿。一旦導(dǎo)入完成恢准,歷史數(shù)據(jù)往往作為存檔,不會(huì)再做更新甫题、刪除操作馁筐。

無(wú)需事務(wù),數(shù)據(jù)一致性要求低

OLAP類業(yè)務(wù)對(duì)于事務(wù)需求較少幔睬,通常是導(dǎo)入歷史日志數(shù)據(jù)眯漩,或搭配一款事務(wù)型數(shù)據(jù)庫(kù)并實(shí)時(shí)從事務(wù)型數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)同步。多數(shù)OLAP系統(tǒng)都支持最終一致性麻顶。

靈活多變,不適合預(yù)先建模

分析場(chǎng)景下舱卡,隨著業(yè)務(wù)變化要及時(shí)調(diào)整分析維度辅肾、挖掘方法,以盡快發(fā)現(xiàn)數(shù)據(jù)價(jià)值轮锥、更新業(yè)務(wù)指標(biāo)矫钓。而數(shù)據(jù)倉(cāng)庫(kù)中通常存儲(chǔ)著海量的歷史數(shù)據(jù),調(diào)整代價(jià)十分高昂舍杜。預(yù)先建模技術(shù)雖然可以在特定場(chǎng)景中加速計(jì)算新娜,但是無(wú)法滿足業(yè)務(wù)靈活多變的發(fā)展需求,維護(hù)成本過(guò)高既绩。

ClickHouse存儲(chǔ)層

ClickHouse從OLAP場(chǎng)景需求出發(fā)概龄,定制開(kāi)發(fā)了一套全新的高效列式存儲(chǔ)引擎,并且實(shí)現(xiàn)了數(shù)據(jù)有序存儲(chǔ)饲握、主鍵索引私杜、稀疏索引蚕键、數(shù)據(jù)Sharding、數(shù)據(jù)Partitioning衰粹、TTL锣光、主備復(fù)制等豐富功能。以上功能共同為ClickHouse極速的分析性能奠定了基礎(chǔ)铝耻。

列式存儲(chǔ)

與行存將每一行的數(shù)據(jù)連續(xù)存儲(chǔ)不同誊爹,列存將每一列的數(shù)據(jù)連續(xù)存儲(chǔ)。示例圖如下:

image.png

相比于行式存儲(chǔ)瓢捉,列式存儲(chǔ)在分析場(chǎng)景下有著許多優(yōu)良的特性频丘。

1)如前所述,分析場(chǎng)景中往往需要讀大量行但是少數(shù)幾個(gè)列泊柬。在行存模式下椎镣,數(shù)據(jù)按行連續(xù)存儲(chǔ),所有列的數(shù)據(jù)都存儲(chǔ)在一個(gè)block中兽赁,不參與計(jì)算的列在IO時(shí)也要全部讀出状答,讀取操作被嚴(yán)重放大。而列存模式下刀崖,只需要讀取參與計(jì)算的列即可惊科,極大的減低了IO cost,加速了查詢亮钦。

2)同一列中的數(shù)據(jù)屬于同一類型馆截,壓縮效果顯著。列存往往有著高達(dá)十倍甚至更高的壓縮比蜂莉,節(jié)省了大量的存儲(chǔ)空間蜡娶,降低了存儲(chǔ)成本。

3)更高的壓縮比意味著更小的data size映穗,從磁盤中讀取相應(yīng)數(shù)據(jù)耗時(shí)更短窖张。

4)自由的壓縮算法選擇。不同列的數(shù)據(jù)具有不同的數(shù)據(jù)類型蚁滋,適用的壓縮算法也就不盡相同宿接。可以針對(duì)不同列類型辕录,選擇最合適的壓縮算法睦霎。

5)高壓縮比,意味著同等大小的內(nèi)存能夠存放更多數(shù)據(jù)走诞,系統(tǒng)cache效果更好副女。

官方數(shù)據(jù)顯示,通過(guò)使用列存速梗,在某些分析場(chǎng)景下肮塞,能夠獲得100倍甚至更高的加速效應(yīng)襟齿。

數(shù)據(jù)有序存儲(chǔ)

ClickHouse支持在建表時(shí),指定將數(shù)據(jù)按照某些列進(jìn)行sort by枕赵。

排序后猜欺,保證了相同sort key的數(shù)據(jù)在磁盤上連續(xù)存儲(chǔ),且有序擺放拷窜。在進(jìn)行等值开皿、范圍查詢時(shí),where條件命中的數(shù)據(jù)都緊密存儲(chǔ)在一個(gè)或若干個(gè)連續(xù)的Block中篮昧,而不是分散的存儲(chǔ)在任意多個(gè)Block赋荆, 大幅減少需要IO的block數(shù)量。另外懊昨,連續(xù)IO也能夠充分利用操作系統(tǒng)page cache的預(yù)取能力窄潭,減少page fault。

主鍵索引

ClickHouse支持主鍵索引酵颁,它將每列數(shù)據(jù)按照index granularity(默認(rèn)8192行)進(jìn)行劃分嫉你,每個(gè)index granularity的開(kāi)頭第一行被稱為一個(gè)mark行。主鍵索引存儲(chǔ)該mark行對(duì)應(yīng)的primary key的值躏惋。

對(duì)于where條件中含有primary key的查詢幽污,通過(guò)對(duì)主鍵索引進(jìn)行二分查找,能夠直接定位到對(duì)應(yīng)的index granularity簿姨,避免了全表掃描從而加速查詢距误。

但是值得注意的是:ClickHouse的主鍵索引與MySQL等數(shù)據(jù)庫(kù)不同,它并不用于去重扁位,即便primary key相同的行准潭,也可以同時(shí)存在于數(shù)據(jù)庫(kù)中。要想實(shí)現(xiàn)去重效果域仇,需要結(jié)合具體的表引擎ReplacingMergeTree惋鹅、CollapsingMergeTree、VersionedCollapsingMergeTree實(shí)現(xiàn)殉簸,我們會(huì)在未來(lái)的文章系列中再進(jìn)行詳細(xì)解讀。

稀疏索引

ClickHouse支持對(duì)任意列創(chuàng)建任意數(shù)量的稀疏索引沽讹。其中被索引的value可以是任意的合法SQL Expression般卑,并不僅僅局限于對(duì)column value本身進(jìn)行索引。之所以叫稀疏索引爽雄,是因?yàn)樗举|(zhì)上是對(duì)一個(gè)完整index granularity(默認(rèn)8192行)的統(tǒng)計(jì)信息蝠检,并不會(huì)具體記錄每一行在文件中的位置。目前支持的稀疏索引類型包括:

  • minmax: 以index granularity為單位挚瘟,存儲(chǔ)指定表達(dá)式計(jì)算后的min叹谁、max值饲梭;在等值和范圍查詢中能夠幫助快速跳過(guò)不滿足要求的塊,減少IO焰檩。
  • set(max_rows):以index granularity為單位憔涉,存儲(chǔ)指定表達(dá)式的distinct value集合,用于快速判斷等值查詢是否命中該塊析苫,減少IO兜叨。
  • ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed):將string進(jìn)行ngram分詞后,構(gòu)建bloom filter衩侥,能夠優(yōu)化等值国旷、like、in等查詢條件茫死。
  • tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed): 與ngrambf_v1類似跪但,區(qū)別是不使用ngram進(jìn)行分詞,而是通過(guò)標(biāo)點(diǎn)符號(hào)進(jìn)行詞語(yǔ)分割峦萎。
  • bloom_filter([false_positive]):對(duì)指定列構(gòu)建bloom filter屡久,用于加速等值、like骨杂、in等查詢條件的執(zhí)行涂身。

數(shù)據(jù)Sharding

ClickHouse支持單機(jī)模式,也支持分布式集群模式搓蚪。在分布式模式下蛤售,ClickHouse會(huì)將數(shù)據(jù)分為多個(gè)分片,并且分布到不同節(jié)點(diǎn)上妒潭。不同的分片策略在應(yīng)對(duì)不同的SQL Pattern時(shí)悴能,各有優(yōu)勢(shì)。ClickHouse提供了豐富的sharding策略雳灾,讓業(yè)務(wù)可以根據(jù)實(shí)際需求選用漠酿。

1) random隨機(jī)分片:寫入數(shù)據(jù)會(huì)被隨機(jī)分發(fā)到分布式集群中的某個(gè)節(jié)點(diǎn)上。

2) constant固定分片:寫入數(shù)據(jù)會(huì)被分發(fā)到固定一個(gè)節(jié)點(diǎn)上谎亩。

3)column value分片:按照某一列的值進(jìn)行hash分片炒嘲。

4)自定義表達(dá)式分片:指定任意合法表達(dá)式,根據(jù)表達(dá)式被計(jì)算后的值進(jìn)行hash分片匈庭。

數(shù)據(jù)分片夫凸,讓ClickHouse可以充分利用整個(gè)集群的大規(guī)模并行計(jì)算能力,快速返回查詢結(jié)果阱持。
更重要的是夭拌,多樣化的分片功能,為業(yè)務(wù)優(yōu)化打開(kāi)了想象空間。比如在hash sharding的情況下鸽扁,JOIN計(jì)算能夠避免數(shù)據(jù)shuffle蒜绽,直接在本地進(jìn)行l(wèi)ocal join; 支持自定義sharding桶现,可以為不同業(yè)務(wù)和SQL Pattern定制最適合的分片策略躲雅;利用自定義sharding功能,通過(guò)設(shè)置合理的sharding expression可以解決分片間數(shù)據(jù)傾斜問(wèn)題等巩那。

另外吏夯,sharding機(jī)制使得ClickHouse可以橫向線性拓展,構(gòu)建大規(guī)模分布式集群即横,從而具備處理海量數(shù)據(jù)的能力噪生。

數(shù)據(jù)Partitioning

ClickHouse支持PARTITION BY子句,在建表時(shí)可以指定按照任意合法表達(dá)式進(jìn)行數(shù)據(jù)分區(qū)操作东囚,比如通過(guò)toYYYYMM()將數(shù)據(jù)按月進(jìn)行分區(qū)跺嗽、toMonday()將數(shù)據(jù)按照周幾進(jìn)行分區(qū)、對(duì)Enum類型的列直接每種取值作為一個(gè)分區(qū)等页藻。

數(shù)據(jù)Partition在ClickHouse中主要有兩方面應(yīng)用:

  • 在partition key上進(jìn)行分區(qū)裁剪桨嫁,只查詢必要的數(shù)據(jù)。靈活的partition expression設(shè)置份帐,使得可以根據(jù)SQL Pattern進(jìn)行分區(qū)設(shè)置璃吧,最大化的貼合業(yè)務(wù)特點(diǎn)。
  • 對(duì)partition進(jìn)行TTL管理废境,淘汰過(guò)期的分區(qū)數(shù)據(jù)畜挨。

數(shù)據(jù)TTL

在分析場(chǎng)景中,數(shù)據(jù)的價(jià)值隨著時(shí)間流逝而不斷降低噩凹,多數(shù)業(yè)務(wù)出于成本考慮只會(huì)保留最近幾個(gè)月的數(shù)據(jù)巴元,ClickHouse通過(guò)TTL提供了數(shù)據(jù)生命周期管理的能力。

ClickHouse支持幾種不同粒度的TTL:

1) 列級(jí)別TTL:當(dāng)一列中的部分?jǐn)?shù)據(jù)過(guò)期后驮宴,會(huì)被替換成默認(rèn)值逮刨;當(dāng)全列數(shù)據(jù)都過(guò)期后,會(huì)刪除該列堵泽。

2)行級(jí)別TTL:當(dāng)某一行過(guò)期后修己,會(huì)直接刪除該行。

3)分區(qū)級(jí)別TTL:當(dāng)分區(qū)過(guò)期后迎罗,會(huì)直接刪除該分區(qū)箩退。

高吞吐寫入能力

ClickHouse采用類LSM Tree的結(jié)構(gòu),數(shù)據(jù)寫入后定期在后臺(tái)Compaction佳谦。通過(guò)類LSM tree的結(jié)構(gòu),ClickHouse在數(shù)據(jù)導(dǎo)入時(shí)全部是順序append寫滋戳,寫入后數(shù)據(jù)段不可更改钻蔑,在后臺(tái)compaction時(shí)也是多個(gè)段merge sort后順序?qū)懟卮疟P啥刻。順序?qū)懙奶匦裕浞掷昧舜疟P的吞吐能力咪笑,即便在HDD上也有著優(yōu)異的寫入性能可帽。

官方公開(kāi)benchmark測(cè)試顯示能夠達(dá)到50MB-200MB/s的寫入吞吐能力,按照每行100Byte估算窗怒,大約相當(dāng)于50W-200W條/s的寫入速度映跟。

有限支持delete、update

在分析場(chǎng)景中扬虚,刪除努隙、更新操作并不是核心需求。ClickHouse沒(méi)有直接支持delete辜昵、update操作荸镊,而是變相支持了mutation操作,語(yǔ)法為alter table delete where filter_expr,alter table update col=val where filter_expr堪置。

目前主要限制為刪除躬存、更新操作為異步操作,需要后臺(tái)compation之后才能生效舀锨。

主備同步

ClickHouse通過(guò)主備復(fù)制提供了高可用能力岭洲,主備架構(gòu)下支持無(wú)縫升級(jí)等運(yùn)維操作。而且相比于其他系統(tǒng)它的實(shí)現(xiàn)有著自己的特色:

1)默認(rèn)配置下坎匿,任何副本都處于active模式盾剩,可以對(duì)外提供查詢服務(wù);

2)可以任意配置副本個(gè)數(shù)碑诉,副本數(shù)量可以從0個(gè)到任意多個(gè)彪腔;

3)不同shard可以配置不提供副本個(gè)數(shù),用于解決單個(gè)shard的查詢熱點(diǎn)問(wèn)題进栽;

ClickHouse計(jì)算層

ClickHouse在計(jì)算層做了非常細(xì)致的工作德挣,竭盡所能榨干硬件能力,提升查詢速度快毛。它實(shí)現(xiàn)了單機(jī)多核并行格嗅、分布式計(jì)算、向量化執(zhí)行與SIMD指令唠帝、代碼生成等多種重要技術(shù)屯掖。

多核并行

ClickHouse將數(shù)據(jù)劃分為多個(gè)partition,每個(gè)partition再進(jìn)一步劃分為多個(gè)index granularity襟衰,然后通過(guò)多個(gè)CPU核心分別處理其中的一部分來(lái)實(shí)現(xiàn)并行數(shù)據(jù)處理贴铜。

在這種設(shè)計(jì)下,單條Query就能利用整機(jī)所有CPU。極致的并行處理能力绍坝,極大的降低了查詢延時(shí)徘意。

分布式計(jì)算

除了優(yōu)秀的單機(jī)并行處理能力,ClickHouse還提供了可線性拓展的分布式計(jì)算能力轩褐。ClickHouse會(huì)自動(dòng)將查詢拆解為多個(gè)task下發(fā)到集群中椎咧,然后進(jìn)行多機(jī)并行處理,最后把結(jié)果匯聚到一起把介。

在存在多副本的情況下勤讽,ClickHouse提供了多種query下發(fā)策略:

  • 隨機(jī)下發(fā):在多個(gè)replica中隨機(jī)選擇一個(gè);
  • 最近hostname原則:選擇與當(dāng)前下發(fā)機(jī)器最相近的hostname節(jié)點(diǎn)拗踢,進(jìn)行query下發(fā)脚牍。在特定的網(wǎng)絡(luò)拓?fù)湎拢梢越档途W(wǎng)絡(luò)延時(shí)秒拔。而且能夠確保query下發(fā)到固定的replica機(jī)器莫矗,充分利用系統(tǒng)cache。
  • in order:按照特定順序逐個(gè)嘗試下發(fā)砂缩,當(dāng)前一個(gè)replica不可用時(shí)作谚,順延到下一個(gè)replica。
  • first or random:在In Order模式下庵芭,當(dāng)?shù)谝粋€(gè)replica不可用時(shí)妹懒,所有workload都會(huì)積壓到第二個(gè)Replica,導(dǎo)致負(fù)載不均衡双吆。first or random解決了這個(gè)問(wèn)題:當(dāng)?shù)谝粋€(gè)replica不可用時(shí)眨唬,隨機(jī)選擇一個(gè)其他replica,從而保證其余replica間負(fù)載均衡好乐。另外在跨region復(fù)制場(chǎng)景下匾竿,通過(guò)設(shè)置第一個(gè)replica為本region內(nèi)的副本,可以顯著降低網(wǎng)絡(luò)延時(shí)蔚万。

向量化執(zhí)行與SIMD

ClickHouse不僅將數(shù)據(jù)按列存儲(chǔ)岭妖,而且按列進(jìn)行計(jì)算。傳統(tǒng)OLTP數(shù)據(jù)庫(kù)通常采用按行計(jì)算反璃,原因是事務(wù)處理中以點(diǎn)查為主昵慌,SQL計(jì)算量小,實(shí)現(xiàn)這些技術(shù)的收益不夠明顯淮蜈。但是在分析場(chǎng)景下斋攀,單個(gè)SQL所涉及計(jì)算量可能極大,將每行作為一個(gè)基本單元進(jìn)行處理會(huì)帶來(lái)嚴(yán)重的性能損耗:

1)對(duì)每一行數(shù)據(jù)都要調(diào)用相應(yīng)的函數(shù)梧田,函數(shù)調(diào)用開(kāi)銷占比高淳蔼;

2)存儲(chǔ)層按列存儲(chǔ)數(shù)據(jù)侧蘸,在內(nèi)存中也按列組織,但是計(jì)算層按行處理肖方,無(wú)法充分利用CPU cache的預(yù)讀能力闺魏,造成CPU Cache miss嚴(yán)重;

3)按行處理俯画,無(wú)法利用高效的SIMD指令;

ClickHouse實(shí)現(xiàn)了向量執(zhí)行引擎(Vectorized execution engine),對(duì)內(nèi)存中的列式數(shù)據(jù),一個(gè)batch調(diào)用一次SIMD指令(而非每一行調(diào)用一次)沪伙,不僅減少了函數(shù)調(diào)用次數(shù)饲常、降低了cache miss,而且可以充分發(fā)揮SIMD指令的并行能力尉尾,大幅縮短了計(jì)算耗時(shí)。向量執(zhí)行引擎,通常能夠帶來(lái)數(shù)倍的性能提升胰柑。

動(dòng)態(tài)代碼生成Runtime Codegen

在經(jīng)典的數(shù)據(jù)庫(kù)實(shí)現(xiàn)中,通常對(duì)表達(dá)式計(jì)算采用火山模型爬泥,也即將查詢轉(zhuǎn)換成一個(gè)個(gè)operator柬讨,比如HashJoin、Scan袍啡、IndexScan踩官、Aggregation等。為了連接不同算子境输,operator之間采用統(tǒng)一的接口蔗牡,比如open/next/close。在每個(gè)算子內(nèi)部都實(shí)現(xiàn)了父類的這些虛函數(shù)嗅剖,在分析場(chǎng)景中單條SQL要處理數(shù)據(jù)通常高達(dá)數(shù)億行辩越,虛函數(shù)的調(diào)用開(kāi)銷不再可以忽略不計(jì)。另外信粮,在每個(gè)算子內(nèi)部都要考慮多種變量黔攒,比如列類型、列的size蒋院、列的個(gè)數(shù)等亏钩,存在著大量的if-else分支判斷導(dǎo)致CPU分支預(yù)測(cè)失效。

ClickHouse實(shí)現(xiàn)了Expression級(jí)別的runtime codegen欺旧,動(dòng)態(tài)地根據(jù)當(dāng)前SQL直接生成代碼姑丑,然后編譯執(zhí)行。如下圖例子所示辞友,對(duì)于Expression直接生成代碼栅哀,不僅消除了大量的虛函數(shù)調(diào)用(即圖中多個(gè)function pointer的調(diào)用)震肮,而且由于在運(yùn)行時(shí)表達(dá)式的參數(shù)類型、個(gè)數(shù)等都是已知的留拾,也消除了不必要的if-else分支判斷戳晌。

image-20191216205308005.png

近似計(jì)算

近似計(jì)算以損失一定結(jié)果精度為代價(jià),極大地提升查詢性能痴柔。在海量數(shù)據(jù)處理中沦偎,近似計(jì)算價(jià)值更加明顯。

ClickHouse實(shí)現(xiàn)了多種近似計(jì)算功能:

  • 近似估算distinct values咳蔚、中位數(shù)豪嚎,分位數(shù)等多種聚合函數(shù);
  • 建表DDL支持SAMPLE BY子句谈火,支持對(duì)于數(shù)據(jù)進(jìn)行抽樣處理侈询;

復(fù)雜數(shù)據(jù)類型支持

ClickHouse還提供了array、json糯耍、tuple扔字、set等復(fù)合數(shù)據(jù)類型,支持業(yè)務(wù)schema的靈活變更温技。

結(jié)語(yǔ)

近年來(lái)ClickHouse發(fā)展趨勢(shì)迅猛革为,社區(qū)和大廠都紛紛跟進(jìn)使用。本文嘗試從OLAP場(chǎng)景的需求出發(fā)荒揣,介紹了ClickHouse存儲(chǔ)層篷角、計(jì)算層的主要設(shè)計(jì)。ClickHouse實(shí)現(xiàn)了大多數(shù)當(dāng)前主流的數(shù)據(jù)分析技術(shù)系任,具有明顯的技術(shù)優(yōu)勢(shì):

  • 提供了極致的查詢性能:開(kāi)源公開(kāi)benchmark顯示比傳統(tǒng)方法快1001000倍恳蹲,提供50MB200MB/s的高吞吐實(shí)時(shí)導(dǎo)入能力)
  • 以極低的成本存儲(chǔ)海量數(shù)據(jù): 借助于精心設(shè)計(jì)的列存、高效的數(shù)據(jù)壓縮算法俩滥,提供高達(dá)10倍的壓縮比嘉蕾,大幅提升單機(jī)數(shù)據(jù)存儲(chǔ)和計(jì)算能力,大幅降低使用成本霜旧,是構(gòu)建海量數(shù)據(jù)倉(cāng)庫(kù)的絕佳方案错忱。
  • 簡(jiǎn)單靈活又不失強(qiáng)大:提供完善SQL支持,上手十分簡(jiǎn)單挂据;提供json以清、map、array等靈活數(shù)據(jù)類型適配業(yè)務(wù)快速變化崎逃;同時(shí)支持近似計(jì)算掷倔、概率數(shù)據(jù)結(jié)構(gòu)等應(yīng)對(duì)海量數(shù)據(jù)處理。

相比于開(kāi)源社區(qū)的其他幾項(xiàng)分析型技術(shù)个绍,如Druid勒葱、Presto浪汪、Impala、Kylin凛虽、ElasticSearch等死遭,ClickHouse更是一整套完善的解決方案,它自包含了存儲(chǔ)和計(jì)算能力(無(wú)需額外依賴其他存儲(chǔ)組件)凯旋,完全自主實(shí)現(xiàn)了高可用呀潭,而且支持完整的SQL語(yǔ)法包括JOIN等,技術(shù)上有著明顯優(yōu)勢(shì)至非。相比于hadoop體系蜗侈,以數(shù)據(jù)庫(kù)的方式來(lái)做大數(shù)據(jù)處理更加簡(jiǎn)單易用,學(xué)習(xí)成本低且靈活度高睡蟋。當(dāng)前社區(qū)仍舊在迅猛發(fā)展中,相信后續(xù)會(huì)有越來(lái)越多好用的功能出現(xiàn)枷颊。

寫在最后

阿里云已經(jīng)率先推出了ClickHouse的云托管產(chǎn)品戳杀,產(chǎn)品首頁(yè)地址:云數(shù)據(jù)庫(kù)ClickHouse,目前正在免費(fèi)公測(cè)中夭苗,歡迎大家點(diǎn)擊鏈接申請(qǐng)免費(fèi)試用信卡。

image-20191217111228844.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市题造,隨后出現(xiàn)的幾起案子傍菇,更是在濱河造成了極大的恐慌,老刑警劉巖界赔,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢习,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淮悼,警方通過(guò)查閱死者的電腦和手機(jī)咐低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袜腥,“玉大人见擦,你說(shuō)我怎么就攤上這事「睿” “怎么了鲤屡?”我有些...
    開(kāi)封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)福侈。 經(jīng)常有香客問(wèn)我酒来,道長(zhǎng),這世上最難降的妖魔是什么癌刽? 我笑而不...
    開(kāi)封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任役首,我火速辦了婚禮尝丐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衡奥。我一直安慰自己爹袁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布矮固。 她就那樣靜靜地躺著失息,像睡著了一般。 火紅的嫁衣襯著肌膚如雪档址。 梳的紋絲不亂的頭發(fā)上盹兢,一...
    開(kāi)封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音守伸,去河邊找鬼绎秒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尼摹,可吹牛的內(nèi)容都是我干的见芹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蠢涝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玄呛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起和二,我...
    開(kāi)封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤徘铝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惯吕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惕它,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年混埠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠缸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钳宪,死狀恐怖揭北,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吏颖,我是刑警寧澤搔体,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站半醉,受9級(jí)特大地震影響疚俱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缩多,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一呆奕、第九天 我趴在偏房一處隱蔽的房頂上張望养晋。 院中可真熱鬧,春花似錦梁钾、人聲如沸绳泉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)零酪。三九已至,卻和暖如春拇勃,著一層夾襖步出監(jiān)牢的瞬間四苇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工方咆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留月腋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓瓣赂,卻偏偏與公主長(zhǎng)得像罗售,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钩述,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • ClickHouse是近年來(lái)備受關(guān)注的開(kāi)源列式數(shù)據(jù)庫(kù)所禀,主要用于數(shù)據(jù)分析(OLAP)領(lǐng)域方面。目前國(guó)內(nèi)社區(qū)火熱,各個(gè)大廠...
    達(dá)微閱讀 817評(píng)論 0 0
  • 【桐心合力】20170515《孩子挑戰(zhàn)》學(xué)而思DAY1/11: 對(duì)于帶讀里提到的父母的兩難處境非常有同感色徘,很多...
    桐麻_(kāi)068b閱讀 409評(píng)論 0 0
  • 今天上午趕早車恭金,然后到了吃飯。晚車趕不上點(diǎn)褂策。 但是卻沒(méi)有想到另一種方案横腿,晚點(diǎn)起,在酒店吃飯斤寂,打個(gè)的耿焊。 這樣既能晚點(diǎn)...
    當(dāng)?shù)?/span>閱讀 296評(píng)論 0 0
  • 春節(jié)期間,陽(yáng)子回到家里與幾個(gè)中學(xué)同學(xué)小聚遍搞,一起聊天罗侯、喝茶、K歌溪猿。小姐妹們都有各自的空間钩杰、各自的事業(yè)纫塌,過(guò)的歲月...
    輕柔細(xì)語(yǔ)閱讀 329評(píng)論 1 1
  • 羈旅江南湖邊館,依山傍湖林掩映讲弄。 疑似如歸何能爾措左?心暢相依愛(ài)相伴。 青石小弄臺(tái)門深垂睬,烏瓦粉檐廊相長(zhǎng)媳荒。 夏草連湖鯉跳...
    琴雪_山人閱讀 209評(píng)論 0 11