簡介:本文翻譯自 Altinity 針對 ClickHouse 的系列技術文章。面向聯機分析處理(OLAP)的開源分析引擎 ClickHouse,因其優良的查詢性能,PB級的數據規模,簡單的架構,被國內外公司廣泛采用。本系列技術文章,將詳細展開介紹 ClickHouse。
前言
本文翻譯自 Altinity 針對 ClickHouse 的系列技術文章。面向聯機分析處理(OLAP)的開源分析引擎 ClickHouse,因其優良的查詢性能,PB 級的數據規模,簡單的架構,被國內外公司廣泛采用。
阿里雲 EMR-OLAP 團隊,基於開源 ClickHouse 進行了系列優化,提供了開源 OLAP 分析引擎 ClickHouse 的雲上托管服務。EMR ClickHouse 完全兼容開源版本的產品特性,同時提供集群快速部署、集群管理、擴容、縮容和監控告警等雲上產品功能,並且在開源的基礎上優化了 ClickHouse 的讀寫性能,提升了 ClickHouse 與 EMR 其他組件快速集成的能力。訪問
譯者:何源(荊杭),阿里雲計算平台事業部高級產品專家
ClickHouse 聚合函數和聚合狀態
ClickHouse 可能有一個獨特的功能——聚合狀態(除了聚合函數外)。你可以參考 和 組合子的文檔。
簡而言之,許多數據庫使用概率數據結構,例如 HyperLogLog(簡稱 HLL)。它用於唯一/去重計算,你可以在Spark、ElasticSearch、Flink、Postgres、BigQuery 和 Redis 等服務中看到它的效果。但通常你只能在聚合函數中應用此函數一次,例如查詢每月唯一用戶數——得到一個數字,這樣就知足了。由於 HLL 結構沒有對應的內部格式,因此無法重用預聚合或部分聚合的數據。而在 ClickHouse 中,你可以這樣做,因為 HLL 結構是一致的。
ClickHouse 的速度非常快,其基本思路是處理原始數據而不是預聚合數據。但是讓我們做個實驗。例如,我們需要為上個月的唯一用戶數計算一些指標。
設想:每天預聚合,然后匯總所有結果。這就是所謂的存儲空間方法——以后你可以只匯總最后 30 個測量值來計算上個月的統計數據,或者只匯總最后 7 個測量值來計算上周的統計數據。
創建我們的預聚合表:
create table events_unique ( date Date, group_id String, client_id String, event_type String, product_id String, value AggregateFunction(uniq, String) ) ENGINE = MergeTree(date, (group_id, client_id, event_type, product_id, date), 8192);
這里將我的聚合聲明為 AggregateFunction(uniq, String)。我們關注的是一些獨特的指標,這些指標是在 String 列上計算的(為了進一步優化,你可能應該使用 FixedString 或二進制數據)。
讓我們將數據插入預聚合表:
INSERT INTO events_unique SELECT date, group_id, client_id, event_type, product_id, uniqState(visitor_id) AS value FROM events GROUP BY date, group_id, client_id, event_type, product_id;
進行冒煙測試,確認其可以正常運行:
SELECT uniqMerge(value) FROM events_unique GROUP BY product_id;
現在讓我們比較原始表和預聚合表的查詢性能。原始查詢:
SELECT uniq(visitor_id) AS c FROM events WHERE client_id = ‘aaaaaaaa’ AND event_type = ‘click’ AND product_id = ‘product1’ AND date >= ‘2017–01–20’ AND date < ‘2017–02–20’; ┌──────c─┐ │ 457954 │ └────────┘ 1 rows in set. Elapsed: 0.948 sec. Processed 13.22 million rows, 1.61 GB (13.93 million rows/s., 1.70 GB/s.)
預聚合表的結果:
SELECT uniqMerge(value) AS c FROM events_unique WHERE client_id = ‘aaaaaaaa’ AND event_type = ‘click’ AND product_id = ‘product1’ AND date >= ‘2017–01–20’ AND date < ‘2017–02–20’; ┌──────c─┐ │ 457954 │ └────────┘ 1 rows in set. Elapsed: 0.050 sec. Processed 39.39 thousand rows, 8.55 MB (781.22 thousand rows/s., 169.65 MB/s.)
結果表明,我們的處理時間縮短到 1/20。
在實踐中,將物化視圖與 AggregatingMergeTree 引擎結合使用,會比使用單獨的表更方便。
總結
ClickHouse 可讓你將聚合狀態存儲在數據庫中,而不僅僅是存儲在業務應用中,這有望帶來頗具吸引力的性能優化和新用例。有關更多詳細信息,請查看關於 AggregatingMergeTree 引擎的豐富文檔。
后續
您已經了解了在 ClickHouse 中處理實時更新相關內容,本系列還包括其他內容:
- ClickHouse 聚合函數和聚合狀態(本文)
- ClickHouse 中的嵌套數據結構
原文鏈接
本文為阿里雲原創內容,未經允許不得轉載。