數(shù)據(jù)分析引擎黑馬 ClickHouse 最新技術(shù)的實(shí)踐與應(yīng)用

點(diǎn)擊可觀看精彩演講視頻
一、ClickHouse 的前世今生
我今天主要講四件事,第一是講講 ClickHouse 的前世今生;第二是給大家講講實(shí)戰(zhàn)應(yīng)用,因?yàn)楹芏嘈』锇橛X(jué)得 ClickHouse 很好,但到底該怎么使用還并不了解;第三介紹比較新的一些Feature,會(huì)挑幾個(gè)我比較感興趣的和大家聊一聊;最后是對(duì)未來(lái)的一些暢想。
1. ClickHouse 的誕生與騰飛
先說(shuō) ClickHouse 是誰(shuí)?ClickHouse 其實(shí)是源自俄羅斯黑科技的一個(gè)引擎,它最早是用于Yandex 公司的工具 Metrica。ClickHouse 一直基于自身新的獨(dú)立架構(gòu)的核心在不斷演進(jìn),它能夠在服務(wù)器集群很大的情況下依然保持穩(wěn)定。目前在國(guó)內(nèi)被騰訊、今日頭條、新浪等多家公司所使用。

為什么 ClickHouse 很火呢?這個(gè)項(xiàng)目是在 2016 年年底的時(shí)候開(kāi)源的,我是在 2017 年把它引進(jìn)中國(guó),來(lái)做 ClickHouse 的中文社區(qū)。最近這一年它突然在國(guó)內(nèi)、國(guó)外都特別火,在 DB Ranking 這個(gè)網(wǎng)站上的排名就上升了 71 位,成為第 50 名,但其實(shí)它已經(jīng)發(fā)展了四年,僅次于它的另一個(gè)熱門(mén)產(chǎn)品是 Snowflake。所以大家看這個(gè)上升的趨勢(shì),Snowflake 這么火,是不是 ClickHouse 將來(lái)會(huì)像 Snowflake 一樣?我之后會(huì)介紹應(yīng)用場(chǎng)景,ClickHouse 和 Snowflake 有相似之處,但它絕對(duì)不是Snowflake,所以 ClickHouse 到底是誰(shuí)?
2. ClickHouse 就是這么快
我們當(dāng)時(shí)的 ClickHouse 技術(shù)架構(gòu)師說(shuō)“ClickHouse 就是這么快”,它是一個(gè)非常快的引擎,列式存儲(chǔ)、列式可壓縮,而且支持模糊查詢,也支持一些復(fù)雜的SQL,幾乎線性的擴(kuò)展;如果用得好,數(shù)據(jù)加載和引入的操作也是最快的,而且簡(jiǎn)單易用,對(duì)新手友好,所以很多人都在快速地使用 ClickHouse。
這張圖是在 2018 年 Meetup 上,新浪Jack Gao分享的數(shù)據(jù),是比較早的版本,但大家可以看到,19 臺(tái)服務(wù)器,300 億/天,800 萬(wàn)次/天有效的查詢,基本上平均查詢時(shí)間在 200 毫秒,ClickHouse 就是這么快,19 臺(tái)服務(wù)器的數(shù)量、200 毫秒對(duì)于一個(gè) OLAP 引擎來(lái)講是很難得的,當(dāng)然它對(duì)一些核心監(jiān)控查詢可能時(shí)間更短,在 40 毫秒。

2018 年的時(shí)候,我們也做了一個(gè)和常見(jiàn)的 OLAP 引擎的橫向比對(duì)測(cè)試??从疫叺膱D會(huì)發(fā)現(xiàn)淺藍(lán)色的柱子,就是 ClickHouse,在單表查詢時(shí)非???,相比其它引擎如傳統(tǒng)的 Hive、Spark-SQL,那是幾十倍的快,Join它稍微慢一些。所以基于場(chǎng)景來(lái)講,它不是 Snowflake,它現(xiàn)在解決的還是一些單表的場(chǎng)景,Join的時(shí)候它跟普通引擎差不多,沒(méi)有那么快,所以如果做寬表這種單表查詢,它是目前大家用得最多的。

ClickHouse 為什么這么快?從我的角度來(lái)看有三點(diǎn)原因:
第一個(gè)是計(jì)算引擎。大家知道它叫向量化計(jì)算,另一個(gè)用向量化計(jì)算引擎的是 Snowflake,在這個(gè)點(diǎn)上這兩個(gè)項(xiàng)目是很像的,它用 C 寫(xiě)的時(shí)候,其實(shí)會(huì)在匯編級(jí)別對(duì)每個(gè)計(jì)算單元都做向量化的處理,后面包括像 C++,它也用了很多極致的代碼框架的優(yōu)化,單表聚合的這個(gè)場(chǎng)景下用散列表的優(yōu)化,包括精細(xì)化的內(nèi)存處理,這些都是 ClickHouse 擅長(zhǎng)的地方。
第二是存儲(chǔ)設(shè)計(jì)。在列存儲(chǔ)上,單獨(dú)的每一列它都嵌套了一個(gè)單獨(dú)的數(shù)據(jù)文件。在列壓縮上,用了很多算法,和別的引擎不同,每一列都可以用單獨(dú)不同的壓縮算法來(lái)提升存儲(chǔ),包括在 ClickHouse 做解析和查詢的時(shí)候,每一個(gè)表選擇的內(nèi)部查詢引擎都可以不同。今年我們還提了一個(gè)叫 Projections 的東西,會(huì)幫助在 ClickHouse 里再加一個(gè)預(yù)聚合,所以它的查明細(xì)、預(yù)聚合也會(huì)很快,解決了非常多查詢場(chǎng)景里的問(wèn)題。
第三是 ClickHouse 的社區(qū)。這是我特別推崇的地方,我也在運(yùn)營(yíng)中國(guó)社區(qū),其實(shí) ClickHouse 全球社區(qū)很有意思,它是自循環(huán)的,沒(méi)有外部依賴,不像過(guò)去大家要做一個(gè)東西,你還得部署一堆 Hadoop、HDFS、Hive、Spark,而 ClickHouse 一套就能搞定,很多我們的用戶就是用一臺(tái)機(jī)器解決了過(guò)去 30 臺(tái) Hadoop 的問(wèn)題,而且用的是自底向上的設(shè)計(jì),每次我們要去合并代碼的時(shí)候都會(huì)被朵夫拆一遍,每一個(gè)審查都非常細(xì)節(jié)。社區(qū)承諾如果出現(xiàn)一個(gè)更快的模式,你提交到社區(qū)里,并且經(jīng)驗(yàn)證在 ClickHouse 里有效的話,社區(qū)會(huì)立馬采納,并在下一個(gè)版本里快速地把它容納進(jìn)來(lái)。所以 ClickHouse 的版本幾乎每個(gè)月要更新一兩版,因?yàn)槿蚨加刑貏e聰明的人在不斷地將它優(yōu)化。當(dāng)然有些人會(huì)詬病它的不穩(wěn)定性,就像最近 CentOS 出滾動(dòng)版,可能是有這樣的問(wèn)題,但是你會(huì)發(fā)現(xiàn)它的迭代速度和最新的東西往往特別快,所以如果大家愿意加入開(kāi)源社區(qū),能學(xué)到很多新的東西,你會(huì)發(fā)現(xiàn)你的東西只要做得好,很快會(huì)在全球范圍內(nèi)散播開(kāi)去。整體來(lái)說(shuō),ClickHouse 高效地把這些技術(shù)全都融合起來(lái),而且非常注重具體實(shí)現(xiàn)的細(xì)節(jié),所以 ClickHouse 的第三個(gè)特性是社區(qū)開(kāi)放性的精神。
二、ClickHouse 的實(shí)戰(zhàn)應(yīng)用
ClickHouse 幫助大家解決了很多固定場(chǎng)景的實(shí)際問(wèn)題,幾乎所有的互聯(lián)網(wǎng)公司都在使用它,包括一些大廠像騰訊、阿里,都開(kāi)始做 ClickHouse 云的服務(wù),傳統(tǒng)行業(yè)也開(kāi)始大量使用 ClickHouse,這都是社區(qū)未來(lái)的一個(gè)機(jī)會(huì)。
1. 騰訊音樂(lè)
在實(shí)踐應(yīng)用上,最早在騰訊用得最多的就是騰訊音樂(lè),做什么呢?主要是解決數(shù)據(jù)倉(cāng)庫(kù)到最后數(shù)據(jù)分析和使用的最后一公里的問(wèn)題。過(guò)去都在做數(shù)倉(cāng),但其實(shí)數(shù)倉(cāng)到最后一公里之間需要有一個(gè) OLAP 引擎能快速響應(yīng)需求,能讓我們的數(shù)據(jù)分析師和運(yùn)營(yíng)人員秒級(jí)查出數(shù)據(jù),ClickHouse 解決的就是這個(gè)問(wèn)題,所以騰訊音樂(lè)是以 ClickHouse 計(jì)算+存儲(chǔ)作為中間件的方式做了實(shí)時(shí)數(shù)倉(cāng),實(shí)現(xiàn)了批流一體計(jì)算。
這張圖是今年 2 月份騰訊音樂(lè) Zelus 做的分享:最早的時(shí)候使用日志流,會(huì)進(jìn)入消息隊(duì)列,也許是 kafka,也許是騰訊內(nèi)部的東西,它通過(guò) Flink 和 Consumer 做了一個(gè)實(shí)時(shí)ETL,實(shí)時(shí)ETL 的時(shí)候會(huì)分兩條線走,一條線現(xiàn)在就進(jìn)入到 ClickHouse 里,去實(shí)現(xiàn)它的交互式數(shù)據(jù)分析和存儲(chǔ);對(duì)于應(yīng)用來(lái)講,所有的即席查詢直接走這條線就出來(lái)了,因?yàn)樗猛瑯拥腅TL,能保證明細(xì)數(shù)據(jù)口徑是一樣的。另一條線走了離線文件,離線文件其實(shí)是走了傳統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù),Spark 和Hadoop 的這一塊,走了中間表,走了寬表,最后結(jié)果表再出來(lái),原來(lái)實(shí)時(shí)的數(shù)據(jù)實(shí)現(xiàn)了批流一體,查詢能夠快速實(shí)現(xiàn),幫助最終用戶有大量的即席查詢報(bào)表。

我相信很多做數(shù)據(jù)的小伙伴都會(huì)遇到這個(gè)問(wèn)題,經(jīng)常領(lǐng)導(dǎo)說(shuō)這個(gè)事要查一下,或者運(yùn)營(yíng)人員說(shuō)給我出一個(gè)東西,你好不容易做了一個(gè)中間表、寬表,出一個(gè)結(jié)果表,過(guò)完以后發(fā)現(xiàn)這個(gè)表只用了一次,其實(shí) ClickHouse 的出現(xiàn)就是解決這個(gè)問(wèn)題,讓大家立刻出數(shù)據(jù),而且現(xiàn)在有很多數(shù)據(jù)分析人員包括運(yùn)營(yíng)人員已經(jīng)會(huì)寫(xiě)SQL,所以我們告訴他這個(gè)東西是怎么樣的,在上面加一個(gè) Superset 或其他的數(shù)據(jù)工具,直接搭上 ClickHouse,業(yè)務(wù)分析人員就可以直接出數(shù)據(jù)而不用研發(fā)人員再做ETL。技術(shù)人員還是在原來(lái)的底層數(shù)據(jù)、中間表等數(shù)據(jù)里多花精力,那些臨時(shí)的即席查詢需求就不需要技術(shù)人員浪費(fèi)時(shí)間每天開(kāi)發(fā)ETL和數(shù)據(jù)腳本了,直接用 ClickHouse 就可以查詢。
2. 新浪
新浪當(dāng)時(shí)實(shí)踐時(shí),面臨的問(wèn)題是每天 300 億條數(shù)據(jù),查詢特別多,達(dá)到800 萬(wàn)次。因?yàn)樗峁┑氖窍到y(tǒng) API,所以很痛苦,后來(lái)用了 ClickHouse 快速查詢,單表查詢以最快的方式完美地解決這個(gè)問(wèn)題。它其實(shí)做了幾件事:第一個(gè)是 ClickHouse 在入庫(kù)的時(shí)候是非??斓?,所以它直接利用了這個(gè)特性,做了實(shí)時(shí)入庫(kù),原始數(shù)據(jù)庫(kù)可以隨便查,因?yàn)樽詈筮^(guò)去還得ETL加匯總層,先原子層、后匯總層、最后再上去,現(xiàn)在直接就到最底層把要的數(shù)據(jù)當(dāng)時(shí)查出,縮短整個(gè)數(shù)據(jù)處理的路徑,ETL也容易擴(kuò)容,資源大大降低。它的使用還是從 kafka開(kāi)始,把復(fù)雜的ETL自己做了一層 kafka,最后從 kafka 直接進(jìn)了 ClickHouse,從 ClickHouse 開(kāi)始,有些數(shù)據(jù)的結(jié)果提取進(jìn)入了 MySQL,通過(guò) Superset 做了一個(gè)DashBoard,通過(guò) Adhoc 界面直接查明細(xì)。前兩天 Grafana 比較熱鬧,它改了協(xié)議,最后通過(guò) Grafana 把這個(gè)數(shù)據(jù)用 ClickHouse 查出來(lái),因?yàn)?MySQL 數(shù)據(jù)量比較大以后就出不來(lái)了,所以 ClickHouse 在這里是通過(guò)日志查詢和這種基礎(chǔ)來(lái)幫助做這件事。

3. 喜馬拉雅
喜馬拉雅其實(shí)也是早期開(kāi)始使用 ClickHouse 的企業(yè),有三個(gè)使用場(chǎng)景,也是國(guó)內(nèi)使用 ClickHouse 最常用的幾個(gè)場(chǎng)景:第一個(gè)是用戶行為分析日志,留存、轉(zhuǎn)化怎么做;第二個(gè)是用戶畫(huà)像圈選,比如要選一波人群,人群中10-15歲有多少人,分別是誰(shuí),最后怎么能直接發(fā)出;喜馬拉雅還用于機(jī)器日志查詢,哪里出問(wèn)題,APM中間哪里能夠分析出各種各樣的異常,就是用 ClickHouse,當(dāng)然也用了千億數(shù)據(jù),秒級(jí)響應(yīng)。整體上說(shuō),其實(shí)它的做法和前面的不太一樣,使用了兩條路線,一條是通過(guò)實(shí)時(shí)數(shù)據(jù),把所謂的用戶事件,包括tracking、events、system logs通過(guò) Spark 做了streaming到 ClickHouse 里;另一條是把原來(lái)一些交易數(shù)據(jù)的標(biāo)簽,從數(shù)倉(cāng)里通過(guò)SQL做批量的數(shù)據(jù)導(dǎo)入 ClickHouse,最后從 ClickHouse 里直接提供最后一步的查詢。無(wú)論是用戶的行為分析、分群,還是最后的日志查詢,都通過(guò)這種方式來(lái)做,這也是一種新的用法。

4. 趣頭條
趣頭條2019年的實(shí)踐應(yīng)用遇到的挑戰(zhàn)是千億數(shù)據(jù),21萬(wàn)次的巨大查詢,用 ClickHouse 的特性完美解決。千億數(shù)據(jù),100多臺(tái)機(jī)器,32核128G,80%的查詢,一秒內(nèi)搞定。它的玩法也比較有特點(diǎn)的,先從 kafka 進(jìn) Flink,一部分?jǐn)?shù)據(jù)進(jìn)了 HDFS,ClickHouse 的查詢優(yōu)勢(shì)在于寬表和單表,Join的時(shí)候它可能沒(méi)有那么快,這個(gè)時(shí)候趣頭條做了一個(gè)創(chuàng)新的方法:引入 presto。presto 可以跨庫(kù)查詢,在做Join的時(shí)候,它把一些數(shù)據(jù)放到 HDFS 里,通過(guò) presto 和 ClickHouse 做Join,通過(guò)這種方式解決一些問(wèn)題。它做了兩個(gè)集群,滿足整個(gè)日志查詢和其它的查詢,一個(gè)是APM查詢的集群,另一個(gè)是給分析師用的集群。

5. B站
B站的場(chǎng)景也比較典型,它是做用戶行為分析。有幾千種事件類型,包括實(shí)時(shí)接入,每天有上千個(gè)查詢,它遇到的挑戰(zhàn)是任意維度、任意事件。在很久以前大家都用OLAP這種引擎去做,但都搞不定,必須得用最明細(xì)的SQL查到最底下的東西,最后分析師還要求秒級(jí)出結(jié)果,這時(shí)候B站做了響應(yīng)式超大規(guī)模的用戶行為分析的東西,和前面兩個(gè)有點(diǎn)類似,第一個(gè)是把原來(lái)離線的數(shù)據(jù)導(dǎo)入,通過(guò) Spark 從 HDFS 里放進(jìn)來(lái),實(shí)時(shí)的數(shù)據(jù)通過(guò) kafka、Flink 進(jìn)來(lái),當(dāng)然現(xiàn)在我們社區(qū)在嘗試寫(xiě)出能直接從 kafka 進(jìn)入、把 Flink 替換掉的東西。通過(guò) ClickHouse 做查詢接入服務(wù),最后通過(guò) JDBC 把各種報(bào)表平臺(tái)、交付查詢都放過(guò)去,當(dāng)然它還做了一些庫(kù)表管理、權(quán)限、元數(shù)據(jù)管理、集群監(jiān)控等內(nèi)部開(kāi)發(fā)。所以整體上,B站把 ClickHouse 用于行為分析的場(chǎng)景。

6. 蘇寧
蘇寧做的是另一個(gè)場(chǎng)景:用戶畫(huà)像。它需要精準(zhǔn)識(shí)別每一個(gè)用戶的標(biāo)簽是什么、降低計(jì)算成本,所以做了物化視圖,用去重解決了用戶畫(huà)像的問(wèn)題。具體來(lái)說(shuō),因?yàn)樵谧鲇脩舢?huà)像時(shí)很多標(biāo)簽加工是離線計(jì)算的,這個(gè)標(biāo)簽不需要實(shí)時(shí)打上,但是查詢或推送的時(shí)候會(huì)需要,所以蘇寧一開(kāi)始把所有相關(guān)的標(biāo)簽在 HDFS 里存了,在 MySQL 里存了維度表,把 ClickHouse 當(dāng)作最后一步給用戶畫(huà)像平臺(tái)使用的場(chǎng)景?,F(xiàn)在我看到很多的傳統(tǒng)用戶也是這么使用 ClickHouse 的——當(dāng)作用戶的查詢平臺(tái),因?yàn)樗牟樵兪亲羁斓摹?/span>

7. 金數(shù)據(jù)
金數(shù)據(jù)它解決的是什么?大家填完統(tǒng)計(jì)報(bào)表,數(shù)據(jù)量可能很大,但填完以后馬上就能看到結(jié)果。金數(shù)據(jù)原來(lái)使用的是 Mongo DB,但是查得不夠快,而且Mongo DB 很多時(shí)候SQL兼容性不好,該怎么辦?現(xiàn)在它的存儲(chǔ)仍是 Mongo DB,但大家每次用金數(shù)據(jù)的報(bào)表去填或者去查的時(shí)候,背后是 ClickHouse 提供給最終使用用戶去查詢,所以 ClickHouse 不僅是給數(shù)據(jù)分析師使用,而且可以作為最終用戶快速查詢明細(xì)數(shù)據(jù)的工具。

8. 虎牙直播
虎牙做日志查詢的基本做法是,通過(guò)幾個(gè) kafka 集群把所有的日志信息都放到 ClickHouse 里,進(jìn)行快速查詢。

剛才的場(chǎng)景比較多,整體上,ClickHouse 的使用場(chǎng)景有幾個(gè)特色。第一它非常快,快到可以讓最終用戶直接使用。第二,它在使用用戶畫(huà)像和用戶日志分析方面非常擅長(zhǎng),因?yàn)檫@是它在俄羅斯誕生時(shí)原生的目的。第三是擅長(zhǎng)做APM查詢log日志,在這個(gè)環(huán)節(jié)里把日志存在 ClickHouse 里而不是 MySQL 里,查詢速度會(huì)比原來(lái)想象的要快很多。
三、ClickHouse 的最新特色 Feature 與未來(lái)
現(xiàn)在有各種各樣的Feature,我講幾個(gè)比較有意思的。經(jīng)常有人問(wèn)我:“你看我SELECT一個(gè)2000行的東西太慢,對(duì)于列式存儲(chǔ)數(shù)據(jù),這件事不是特別友好,怎么辦呢?”就把相關(guān)的列合并,在使用的時(shí)候稍微解析一下,ClickHouse 的速度就上去了,不要把它當(dāng)成是2000列的,而是把2000列變成100列,100列里面根據(jù)不同的維度再區(qū)分,它就會(huì)很快,這是2021年的其中一個(gè)新Feature。

第二個(gè)是剛才說(shuō)的 Projections。Projections 的特點(diǎn)是可以做預(yù)聚合,而且這和以前的 Vertica 是不一樣的,Vertica 過(guò)去只支持一些聚合函數(shù)的預(yù)聚合,而 Projections 支持所有的函數(shù)。

還有存算分離。很多小伙伴說(shuō) ClickHouse 怎么存算分離?最近我們的社區(qū)公眾號(hào)“Clickhouse 開(kāi)發(fā)者”里連續(xù)發(fā)了案例——怎么在騰訊云上做存算分離,怎么做S3的存算分離。社區(qū)也會(huì)順應(yīng)趨勢(shì),快速、逐步地做存算分離。

余下感興趣的大家可以去訂閱最后一頁(yè)社區(qū)的微信公眾號(hào),里面會(huì)有細(xì)節(jié),也有非常多的Meetup視頻我也整理在B站“ClickHouse 社區(qū)官方號(hào)”上,大家可以仔細(xì)學(xué)習(xí)。
對(duì)于未來(lái)暢想,剛才提到了很多的 Roadmap,ClickHouse 會(huì)在具體深入場(chǎng)景和結(jié)合解決客戶使用數(shù)據(jù)最后一公里上做非常多的工作。在中國(guó)我們遇到了非常多用戶和客戶提出的想法和需求,所以現(xiàn)在中國(guó)社區(qū)也考慮是不是將來(lái)有機(jī)會(huì)能成為 ClickHouse 商業(yè)化的公司和俄羅斯一起把 ClickHouse 做大做好。
ClickHouse 有這樣一些資源,在網(wǎng)站 Clickhouse.Yandex 上,國(guó)內(nèi)的志愿者社區(qū)是www.clickhouse.com.cn,也可以注明公司-職業(yè)-姓名加我的微信號(hào)Guodaxia2999,一起把社區(qū)做的更好。非常歡迎大家使用 ClickHouse,讓它成為你公司數(shù)據(jù)分析的最后一公里。
講師簡(jiǎn)介
郭煒
易觀CTO、騰訊云TVP
易觀CTO,騰訊云TVP,全球頂級(jí)開(kāi)源基金會(huì) - Apache基金會(huì)正式 Member,Apache DolphinScheduler 發(fā)起人 & PMC,ClickHouse 中國(guó)社區(qū)發(fā)起人,中國(guó)軟件行業(yè)協(xié)會(huì)智能應(yīng)用服務(wù)分會(huì)副主任委員,中國(guó)開(kāi)源社區(qū)最佳 33 人。郭煒先生畢業(yè)于北京大學(xué),曾任聯(lián)想研究院大數(shù)據(jù)總監(jiān),萬(wàn)達(dá)電商數(shù)據(jù)部總經(jīng)理,先后在中金、IBM、Teradata任大數(shù)據(jù)方重要職位,對(duì)大數(shù)據(jù)前沿研究做出卓越貢獻(xiàn)。2015年加入易觀后,推動(dòng)易觀大數(shù)據(jù)技術(shù)架構(gòu)及體系搭建,易觀混合云架構(gòu)搭建;2018年提出大數(shù)據(jù)IOTA架構(gòu)(Big Data IOTA)并提出企業(yè)“數(shù)據(jù)河”(Data River)的概念,帶領(lǐng)團(tuán)隊(duì)打造秒算數(shù)據(jù)計(jì)算引擎,進(jìn)行了架構(gòu)驗(yàn)證,同時(shí)在易觀開(kāi)源Dolphin Scheduler,在2019年入選Apache基金孵化器,2021年被評(píng)選為Apache Foundation Member成員。
點(diǎn)擊觀看峰會(huì)的精彩總結(jié)視頻??


