《ClickHouse原理解析與應用實踐》讀書筆記


第1章 ClickHouse的前世今生

開篇提到了Google開啟大數據處理時代的三篇論文“Google File System”、“Google MapReduce”和“Google Bigtable”,號稱三駕馬車。后來一度Hadoop成為大數據處理的代名詞,只要談到大數據處理,沒有用到Hadoop就認為不屬於大數據處理一樣,雖然Hadoop生態化的屬性帶來了很多便利,生態內部的組件不需要重復造輪子,只需要相互借力、組合就能形成新的方案。但是生態化的另一面就是臃腫和復雜,維護成本越來越高,Hadoop在海量數據和高時效性的雙重壓力下,顯得力不從心了。

在OLAP領域,常見的架構分為三類:

(1)ROLAP(Relation OLAP,關系型OLAP),直接使用關系模型構建,數據模型使用星型模型或者雪花模型;

(2)MOLAP(Multidimensional OLAP,多維型OLAP),使用多維數組的形式保存數據,核心思想是借助預先聚合的結果,使用空間換取時間的形式最終提升查詢性能。

(3)HOLAP(Hybrid OLAP,混合架構的OLAP)

ClickHouse名稱的含義:

ClickHouse=Click Stream+Data WareHouse

第2章 ClickHouse架構概述

2.1 ClickHouse的核心特性

(1)完備的DBMS功能,支持DDL、DML、權限控制、數據備份與恢復、分布式管理

(2)列式存儲與數據壓縮,默認使用LZ4算法壓縮

(3)向量化執行引擎,為了實現向量化執行,需要利用CPU的SIMD指令,SIMD的全稱是Single Instruction Multiple Data,即單條指令操作多條數據,原理是在CPU寄存器層面實現數據的並行操作。目前利用SSE4.2指令集實現向量化執行。

(4)關系模型與SQL查詢,大小寫敏感

(5)多樣化的表引擎,擁有合並樹、內存、文件、接口和其他6大類20多種表引擎

(6)多線程與分布式,計算移動比數據移動更加划算,支持分區(縱向擴展,利用多線程原理)和分片(橫向擴展,利用分布式原理)

(7)多主架構,每個節點角色對等

(8)在線查詢

(9)數據分片與分布式查詢,數據分片是將數據進行橫向切分,一種面向海量數據的場景下,解決存儲和查詢瓶頸的有效手段,是一種分治思想的體現。ClickHouse提供了本地表(Local Table)與分布式表(Distributed Table)的概念。一張本地表等同於一份數據的分片。而分布式表本身不存儲任何數據,它是本地表的訪問代理,其作用類似於分庫中間件,借助分布式表,能夠代理訪問多個數據分片,從而實現分布式查詢。

2.2 ClickHouse的架構設計

(1)Column與Field,內存中的一列數據由一個Column對象表示。如果需要操作單個具體的值,則需要使用Field對象,Field對象代表一個單值

(2)DataType,數據的序列化和反序列工作由DataType負責

(3)Block與Block流,ClickHouse內部的數據操作是面向Block對象進行的,並且采用了流的形式,Block對象可以看作數據表的子集。Block對象的本質是由數據對象、數據類型和列名稱組成的三元組,即Column、DataType及列名稱字符串。流操作有兩組頂層接口:IBlockInputStream負責數據的讀取和關系運算,IBlockOutputStream負責將數據輸出到下一個環節。

(4)Table,在數據表的底層設計中並沒有所謂的Table對象,它直接使用IStorage接口指代數據表。在數據查詢時,IStorage負責根據AST查詢語句的指示要求,返回指定列的原始數據,之后再將數據交由Interpreter做進一步處理。

(5)Parser與Interpreter,Parser分析器負責創建AST對象,而Interpreter解釋器則負責解釋AST,並進一步創建查詢的執行管道,他們與IStorage一起,串聯起整個數據查詢的過程

(6)Functions與Aggregate Functions,普通函數由IFunction接口定義,在函數具體執行過程中,並不會一行一行地運算,而是采用向量化的方式直接作用於一整列數據。聚合函數由IAggregateFunction接口定義,相比無狀態的普通函數,聚合函數是有狀態的,聚合函數的狀態支持序列化與反序列化,所以能夠在分布式節點之間進行傳輸,以實現增量計算。

(7)Cluster與Replication,ClickHouse的1個節點只能擁有1個分片,也就是說如果要實現1分片、1副本,則至少需要部署2個服務節點。分片只是一個邏輯概念,其物理承載還是由副本承擔的。

2.3 Clickhouse為何如此之快

設計采用了自下而上的方式

(1)着眼硬件,先想后做,充分利用CPU L3的緩存

(2)算法在前,抽象在后,在字符串搜索方面,對於常量,使用Volnitsky算法,對於非常量,使用CPU的向量化執行SIMD,暴力優化;正則匹配使用re2和hyperscan算法,性能是算法選擇的首要考量標准

(3)用於嘗鮮,不行就換,選擇最合適、最快的算法

(4)特定場景,特殊優化,根據數據量不同選擇不同的算法。去重計數uniqCombined函數,當數據量較小的時候,選擇Array保存,當數據量中等的時候,選擇HashSet保存,當數據量很大的時候,使用HyperLogLog算法。對於數據結構比較清晰的場景,使用代碼生成技術實現循環展開,以減少循環次數,SIMD被廣泛應用於文本轉換、數據過濾、數據解壓和JSON轉換

(5)持續測試,持續改進,使用真實場景的數據進行測試。

第3章 安裝與部署

 這部分使用RPM包安裝比較簡單,下載RPM包后,執行下述命令進行安裝

[root@mdw clickhouse]# ls
clickhouse-client-20.3.12.112-1.el7.x86_64.rpm clickhouse-server-20.3.12.112-1.el7.x86_64.rpm
clickhouse-common-static-20.3.12.112-1.el7.x86_64.rpm clickhouse-server-common-20.3.12.112-1.el7.x86_64.rpm
[root@mdw clickhouse]# rpm -ivh *.rpm
Preparing... ################################# [100%]
Updating / installing...
1:clickhouse-server-common-20.3.12.################################# [ 25%]
2:clickhouse-common-static-20.3.12.################################# [ 50%]
3:clickhouse-server-20.3.12.112-1.e################################# [ 75%]
Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
4:clickhouse-client-20.3.12.112-1.e################################# [100%]
Create user clickhouse.clickhouse with datadir /var/lib/clickhouse

啟動服務端

[root@mdw clickhouse-server]# service clickhouse-server start
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE

啟動客戶端

[root@mdw clickhouse-server]# clickhouse-client
ClickHouse client version 20.3.12.112.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.3.12 revision 54433.

mdw :) show databases;

SHOW DATABASES

┌─name────┐
│ default │
│ system │
└─────────┘

2 rows in set. Elapsed: 0.007 sec.

目錄結構說明:

(1)/etc/clickhouse-server/:服務端的配置文件目錄,包括全局配置config.xml和用戶配置user.xml,詳細如下所示:

[root@mdw clickhouse-server]# ll /etc/clickhouse-server/
total 32
-rw-r--r-- 1 root root 22610 Jun 25 21:37 config.xml
-rw-r--r-- 1 root root 5190 Jun 25 21:37 users.xml

(2)/var/lib/clickhouse/:默認的數據存儲目錄,詳細如下所示:

[root@mdw clickhouse-server]# ll /var/lib/clickhouse/
total 4
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 cores
drwxr-x--- 4 clickhouse clickhouse 35 Jul 16 15:08 data
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 dictionaries_lib
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 flags
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 format_schemas
drwxr-x--- 4 clickhouse clickhouse 35 Jul 16 15:08 metadata
drwxr-x--- 2 clickhouse clickhouse 41 Jul 16 15:08 preprocessed_configs
-rw-r----- 1 clickhouse clickhouse 58 Jul 16 15:08 status
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 tmp
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 user_files

(3)/var/log/clickhouse-server/:默認保存日志的目錄,詳細如下所示:

[root@mdw clickhouse-server]# ll /var/log/clickhouse-server/
total 68
-rw-r----- 1 clickhouse clickhouse 0 Jul 16 15:08 clickhouse-server.err.log
-rw-r----- 1 clickhouse clickhouse 61856 Jul 16 15:16 clickhouse-server.log
-rw-r----- 1 clickhouse clickhouse 568 Jul 16 15:08 stderr.log
-rw-r----- 1 clickhouse clickhouse 0 Jul 16 15:08 stdout.log

上述是使用RPM包安裝的方式,也可以使用源碼編譯安裝,自己也是折騰了好幾天才編譯通過,有三點經驗分享:

(1)直接從github下載代碼,速度受到限制,尤其下載第三方依賴包的時間會很長,自己嘗試了幾次,下載速度只有幾k每秒,最后采用將github路徑克隆到碼雲上的方式解決了;

(2)代碼下載完成后,編譯時,不要使用配置很低的虛擬機進行編譯,要不然可能1~2天也無法編譯完成,建議使用配置較好一點的物理機編譯;

(3)clickhouse依賴的第三方源碼,並沒有指明具體的版本,所以在編譯時,要通過git多切換幾次版本,多次嘗試,將clickhouse本身的代碼與依賴第三方代碼的版本匹配一致,才能編譯成功,同時要注意,當切換了第三方源碼的版本后,需要對應修改clickhouse中的CMakeList文件,要不然會出現不匹配或者文件找不到的問題。

第4章 數據定義

4.1 ClickHouse的數據類型

大致分為三類:基礎類型、復合類型和特殊類型

關於數據類型的詳細信息,在下面的網址上有詳細的信息,這里不再贅述,只是對幾個特殊的地方進行說明。

https://clickhouse.tech/docs/en/sql-reference/data-types/

(1)ClickHouse支持正無窮、負無窮和非數字的表達方式,示例如下:

mdw :) select 0.8/0

SELECT 0.8 / 0

┌─divide(0.8, 0)─┐
│ inf │
└────────────────┘

1 rows in set. Elapsed: 0.005 sec.

mdw :) select -0.8/0

SELECT -0.8 / 0

┌─divide(-0.8, 0)─┐
│ -inf │
└─────────────────┘

1 rows in set. Elapsed: 0.004 sec.

mdw :) select 0/0

SELECT 0 / 0

┌─divide(0, 0)─┐
│ nan │
└──────────────┘

1 rows in set. Elapsed: 0.003 sec.

(2)不同精度定點數之間的四則運算

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM