楠木軒

OLAP實時分析之ClickHouse列式存儲數據庫

由 雋寶霞 發佈於 科技

一、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、列式計算

在相對龐大的數據分析時,通常會選擇生成一張大寬表,並且存放到列式數據庫中,為了保證高效率執行,可能會把數據分到不同的庫和表中,結構一樣,基於多線程去統計不同的表,然後合併統計結果。

基本原理:多線程併發去執行不同的表的統計,然後彙總統計,相對而言統計操作不難,但是需要適配不同類型的統計,比如百分比,總數,分組等,編碼邏輯相對要求較高。