ClickHouse的特性及讀寫

Quinto0發表於2020-09-25

1 ClickHouse特性

  OLAP資料庫一般有2個要求:①容量要比關係型資料庫大,②線上查詢的速度要快。ClickHouse這兩點都滿足並且還支援標準的sql,支援比較複雜的語句,支援分散式。ClickHouse的幾個顯著特點如下:

  (1)列式儲存

  列式儲存的優點:①列式儲存不同於行式儲存,以行為單位進行儲存,行式儲存更變故搜尋查詢。列式儲存以列為單位進行儲存,這樣更適合做聚合計算,如求和是針對一列的資料進行求和,這一列的資料又放在一起。②行式儲存每個欄位型別不一致,列式儲存不同的型別是不在一起的,一個資料塊儲存的型別都是一致的,這樣的話就便於壓縮,型別相同壓縮演算法發揮的空間就比較大,壓縮比高,所以海量資料的話就能對節省磁碟空間。③因為一個資料塊型別相同,壓縮比高,不僅節省了磁碟空間,還節省了記憶體空間,可以在記憶體中儲存更多的資料。

  列式儲存的缺點:不支援事務

  (2)支援DBMS的功能

  支援的SQL和關係型資料庫基本沒有什麼差別,支援標準SQL的大部分語法,包括DDL和DML及各種函式。雖然ClickHouse可以修改資料結構,可以刪除資料,但是效能不好。

  (3)支援多種引擎

  ClickHouse與Mysql型別把表級別的儲存引擎外掛化,支援的引擎可以分為6大類,用的最多的是MegreTree家族

2 ClickHouse的寫入

  一般關係型資料的寫入基本上是隨機寫,為了方便查詢,要知道插入的位置,找到合適的位置插入。寫入操作本事不重,但是要找到合適的位置就是個問題,隨機的讀寫,每次寫入位置不同,機械磁碟的磁頭就不同的轉找位置,所以寫入能力比較弱。像HBASE,也是隨機寫入,但是採用LSM樹進行是非同步的寫入,先把資料寫到記憶體,就完事了,要插入的位置交給磁碟去處理。

  ClickHouse也是採用了LSM Tree結構資料寫入後定期在後臺合併。寫入操作是先寫到記憶體,然後在寫磁碟的時候不是寫到對應的位置,而是直接寫到一個臨時的分割槽裡面,全部都堆在記憶體資料量大的話很麻煩,然後會簡單的做個排序,後臺會非同步週期性的將臨時分割槽的資料合併到整個儲存分割槽中

3 ClickHouse的讀取

  ClickHouse將資料劃分為多個分割槽(partition),每個分割槽再進一步劃分為多個索引段(index ganularity)。把分割槽裡面的資料劃分成細粒度的好處是可以多核並行處理。

  假設一個資料有3個分割槽,執行一條查詢SQL沒有指定任何分割槽的話就利用多執行緒,把SQL提交到每個分割槽查詢,每個CPU現成管理一個分割槽的資料查詢,最後合併結果。這種極致的並行處理能力極大的降低了查詢的延遲。但是因為查詢是多執行緒的,所以非常消耗CPU,每條SQL都是並行的,這樣的話帶來的問題就是並行查詢很多SQL的時候就會併發非常高,核數不夠的話CPU就會不停的線上程之間來回切換。CPU在大量執行緒裡面輪轉本事就要消耗CPU,所以開銷更大。

  ClickHouse對一條SQL就已經是高併發,並行處理了,如果提交的SQL還是高併發就不適合使用ClickHouse。ClickHouse適合查詢資料量比較大,SQL比較複雜的查詢,他的單一SQL處理能力非常強,因為是並行的,如即席查詢,或者像大屏這種低頻的查詢。不適合開發給使用者,進行高QPS的查詢業務,他的QPS理論上比Mysql還要低。

4 與標準SQL的區別

4.1 Insert

  與標準SQL基本一致,包括標準的插入

INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

  以及表到表的插入

INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...

  但是和hive不一樣沒有insert overwrite

4.2 Update,Delete

  ClickHouse有Update和Delete的能力,可看做是Alter的一種,但是和一般的OLAP資料庫不一樣,稱為Mutation查詢。Mutation的語法,其實是資料結構的調整,本身不是以資料為單位的修正。

  Mutation是很重的操作,因為每次修改或者刪除都會導致放棄目標資料原有的分割槽,意味著分割槽會被重寫,假設我們以天為分割槽。假設一個分割槽內的資料有被刪除或者修改了。刪除的話他是把這個分割槽的資料重新的再建立一個新分割槽,沒有刪除的資料就會重新複製一份,老分割槽的資料暫時不動,做資料合併的時候他會被刪除掉。我們查的時候感覺不出,其實分割槽已經替換了,所以是個很重的操作,而且不支援事務。Mutation支援分為兩步,同步的操作時在新增資料新增分割槽的時候把就分割槽打上邏輯上的失敗標記,指導觸發合併的時候才會刪除就資料釋放磁碟空間

  所以要做Update和Delete的話儘量做批量的操作,不進行頻繁的小資料操作。

  刪除

ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr

  修改

ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr

4.3 Select

  select查詢與標準SQL差別不大:①支援子查詢②支援with子句③支援join(不推薦,join無法使用快取)④但是不支援視窗函式⑤不支援自定義函式,mysql可以做個function自定義函式,還有儲存過程,hive有個變相的方法語法上不支援,但是可以寫程式碼自定義jar包釋出成一個函式。ClickHouse是c++寫的,只能通過改原始碼編譯可能支援部分的,只能是常駐特別簡單的,針對業務的函式不可能每次重編譯,所以不行。⑥group by操作增加了按照維度來計算彙總的操作:with rollup(上卷)從右往左依次去掉維度彙總/with cube(立方體)從右邊開始去完維度,從左邊開始去維度;/with total(只計算合計)等操作

4.4 Alert

  可以根據欄位或者資料結構進行調整,這種alert都是比較重,一般都是在夜裡批量的操作

ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...

4.5 匯出資料

  即席查詢往往是從資料庫裡臨時需要匯出一張報表來匯出execel讓業務人員去用,所以匯出是常用的,常用的就是csv,csvwithNames是帶表頭的

clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro

  對應的插入語句為

cat file.avro | clickhouse-client --query="INSERT INTO {some_table} FORMAT Avro"

相關文章