OLAP實時分析之ClickHouse列式存儲數據庫
1、基礎簡介
Yandex開源的數據分析的數據庫,名字叫做ClickHouse,適合流式或批次入庫的時序數據。ClickHouse不應該被用作通用數據庫,而是作為超高性能的海量數據快速查詢的分佈式實時處理平台,在數據彙總查詢方面(如GROUP BY),ClickHouse的查詢速度非常快。
2、數據庫特點
(1)列式數據庫
列式數據庫是以列相關存儲架構進行數據存儲的數據庫,主要適合於批量數據處理和即時查詢。
(2)數據壓縮
在一些列式數據庫管理系統中不是用數據壓縮。但是, 數據壓縮在實現優異的存儲系統中確實起着關鍵的作用。
(3)數據的磁盤存儲
許多的列式數據庫只能在內存中工作,這種方式會造成比實際更多的設備預算。ClickHouse被設計用於工作在傳統磁盤上的系統,它提供每GB更低的存儲成本。
(4)多核心並行處理
大型查詢可以以很自然的方式在ClickHouse中進行並行化處理,以此來使用當前服務器上可用的所有資源。
(5)多服務器分佈式處理
在ClickHouse中,數據可以保存在不同的shard上,每一個shard都由一組用於容錯的replica組成,查詢可以並行的在所有shard上進行處理。
(6)支持SQL和索引
ClickHouse支持基於SQL的查詢語言,該語言大部分情況下是與SQL標準兼容的。支持的查詢包括GROUPBY,ORDERBY,IN,JOIN以及非相關子查詢。不支持窗口函數和相關子查詢。按照主鍵對數據進行排序,這將幫助ClickHouse以幾十毫秒的低延遲對數據進行特定值查找或範圍查找。
(7)向量引擎
為了高效的使用CPU,數據不僅僅按列存儲,同時還按向量(列的一部分)進行處理。
(8)實時的數據更新
ClickHouse支持在表中定義主鍵。為了使查詢能夠快速在主鍵中進行範圍查找,數據總是以增量的方式有序的存儲在MergeTree中。因此,數據可以持續不斷高效的寫入到表中,並且寫入的過程中不會存在任何加鎖的行為。
3、整合方式
基於Druid和Mybatis組件,整合ClickHouse數據庫,在用法上和MySQL整合有點區別。
二、數據分析能力1、OLAP場景特徵
· 大多數是讀請求
· 數據總是以相當大的批(> 1000 rows)進行寫入
· 不修改已添加的數據
· 每次查詢都從數據庫中讀取大量的行,但是同時又僅需要少量的列
· 寬表,即每個表包含着大量的列
· 較少的查詢(通常每台服務器每秒數百個查詢或更少)
· 對於簡單查詢,允許延遲大約50毫秒
· 列中的數據相對較小: 數字和短字符串(例如,每個URL 60個字節)
· 處理單個查詢時需要高吞吐量(每個服務器每秒高達數十億行)
· 事務不是必須的
· 對數據一致性要求低
· 每一個查詢除了一個大表外都很小
· 查詢結果明顯小於源數據,換句話説,數據被過濾或聚合後能夠被盛放在單台服務器的內存中
2、列式數據存儲
(1)、行式數據
(2)、列式數據
3、對比分析
分析類查詢,通常只需要讀取表的一小部分列。在列式數據庫中可以只讀取需要的數據。數據總是打包成批量讀取的,所以壓縮是非常容易的。同時數據按列分別存儲這也更容易壓縮。這進一步降低了I/O的體積。由於I/O的降低,這將幫助更多的數據被系統緩存。
三、列式計算1、列數數據
行式存儲和列式存儲,數據在磁盤上的組織結構有着根本不同,數據分析計算時,行式存儲需要遍歷整表,列式存儲只需要遍歷單個列,所以列式庫更適合做大寬表,用來做數據分析計算。
2、列式計算
在相對龐大的數據分析時,通常會選擇生成一張大寬表,並且存放到列式數據庫中,為了保證高效率執行,可能會把數據分到不同的庫和表中,結構一樣,基於多線程去統計不同的表,然後合併統計結果。
基本原理:多線程併發去執行不同的表的統計,然後彙總統計,相對而言統計操作不難,但是需要適配不同類型的統計,比如百分比,總數,分組等,編碼邏輯相對要求較高。