StarRocks數(shù)據(jù)庫查詢加速及Colocation Join工作原理
注:本篇文章闡述的是StarRocks-3.2版本的Colocation Join
官網(wǎng)文章地址:
一、StarRocks數(shù)據(jù)劃分
在介紹Colocation Join之前,再回顧下StarRocks的數(shù)據(jù)劃分及tablet多副本機制。
StarRocks支持兩層的數(shù)據(jù)劃分,第一層是Range Partition,第二層是Hash Bucket(Tablet)。StarRocks的數(shù)據(jù)表按照分區(qū)分桶規(guī)則,被水平切分成若干個數(shù)據(jù)分片(Tablet,也稱作數(shù)據(jù)分桶 Bucket)存儲在不同的be節(jié)點上,每個tablet都有多個副本(默認是3副本)。各個 Tablet 之間的數(shù)據(jù)沒有交集,并且在物理上是獨立存儲的。Tablet 是數(shù)據(jù)移動、復制等操作的最小物理存儲單元。 一個 Tablet 只屬于一個數(shù)據(jù)分區(qū)(Partition),而一個 Partition 包含若干個 Tablet。
下圖說明 Table、Partition、Bucket(Tablet) 的關(guān)系:
- 假設(shè)Table 按照 Range 的方式按照 date 字段進行分區(qū),得到了 N 個 Partition
- 每個 Partition 通過相同的 Hash 方式將其中的數(shù)據(jù)劃分為 M 個 Bucket(Tablet)
- 從邏輯上來說,Bucket 1 可以包含 N 個 Partition 中劃分得到的數(shù)據(jù),比如下圖中的 Tablet 11、Tablet 21、Tablet N1
1.1 分區(qū)
邏輯概念,分區(qū)用于將數(shù)據(jù)劃分成不同的區(qū)間,主要作用是將一張表按照分區(qū)鍵拆分成不同的管理單元。查詢時,通過分區(qū)裁剪,可以減少掃描的數(shù)據(jù)量,顯著優(yōu)化查詢性能。
1.2 分桶
物理概念,StarRocks一般采用Hash算法作為分桶算法。在同一分區(qū)內(nèi),分桶鍵哈希值相同的數(shù)據(jù)會劃分到同一個tablet(數(shù)據(jù)分片),tablet以多副本冗余的形式存儲,是數(shù)據(jù)均衡和恢復的最?單位,數(shù)據(jù)導入和查詢最終都下沉到所涉及的 tablet副本上。
二、Colocation Join實現(xiàn)原理
2.1 Colocate Join概述
在數(shù)據(jù)分布滿足一定條件的前提下,計算節(jié)點只需做本地 Join,減少跨節(jié)點的數(shù)據(jù)移動和網(wǎng)絡(luò)傳輸開銷,提高查詢性能。Colocate Join 十分適合幾張大表按照相同字段分桶的場景,這樣可以將數(shù)據(jù)預先存儲到相同的分桶中,實現(xiàn)本地計算。
要理解這個算法,需要先了解以下幾個概念:
- Colocation Group(CG):同一 CG 內(nèi)的表需遵循相同的 Colocation Group Schema(CGS),即表對應(yīng)的分桶副本具有一致的分桶鍵、副本數(shù)量和副本放置方式。如此可以保證同一 CG 內(nèi),所有表的數(shù)據(jù)分布在相同一組 BE 節(jié)點上。
- Colocation Group Schema(CGS):用于描述一個 CG 中的Table,和Colocation相關(guān)的通用 Schema 信息。包括分桶列類型,分桶數(shù)以及副本數(shù)等。
- 分桶編號Bucket Seq:一個表的數(shù)據(jù),根據(jù)分桶列 Hash、對桶數(shù)取模后落在某一個分桶內(nèi)。假設(shè)一個 Table 的分桶數(shù)為 8,則共有 [0, 1, 2, 3, 4, 5, 6, 7] 8 個分桶(Bucket)。因此【分桶列 Hash %桶數(shù) 】一致的數(shù)據(jù)會劃分到同一個桶中。
2.2 Colocate Join工作原理
Colocation Join 功能,是將一組擁有相同CGS 的 Table 組成一個 CG。并保證這些 Table 對應(yīng)的數(shù)據(jù)分片會落在同一個 BE 節(jié)點上。使得當 CG 內(nèi)的表進行分桶列上的 Join 操作時,可以通過直接進行本地數(shù)據(jù) Join,減少數(shù)據(jù)在節(jié)點之間的傳輸耗時。
因此核心問題直接轉(zhuǎn)變成【如果保證這些table對應(yīng)的數(shù)據(jù)分片會落在同一個be節(jié)點上?】
同一 CG 內(nèi)的Table必須保證以下屬性:
(1)分桶列和分桶數(shù)
同一 CG內(nèi)表的分桶鍵的類型、數(shù)量和順序完全一致,并且桶數(shù)一致,從而保證多張表的數(shù)據(jù)分片能夠一一對應(yīng)地進行分布控制。
分桶列,即在建表語句中distributed by hash(col1, col2, ...) 中指定的列。分桶列決定了一張表的數(shù)據(jù)通過哪些列的值進行Hash劃分到不同的Tablet 中。同一 CG內(nèi)的 Table 必須保證分桶列的類型和數(shù)量完全一致,并且桶數(shù)一致,才能保證多張表的數(shù)據(jù)分片能夠一一對應(yīng)的進行分布控制。
(2)副本數(shù)
同一個 CG內(nèi)所有表的所有分區(qū)(Partition)的副本數(shù)必須一致。如果不一致,可能出現(xiàn)某一個 Tablet 的某一個副本,在同一個 BE 上沒有其他的表分片的副本對應(yīng)。不過,同一個 CG 內(nèi)的表,分區(qū)的個數(shù)、范圍以及分區(qū)列的類型不要求一致。
ps:同一個 CG 內(nèi)所有表的分區(qū)鍵,分區(qū)數(shù)量可以不同。因為Partition只是一個邏輯上的分區(qū),真正影響數(shù)據(jù)分布在哪一個BE節(jié)點的是由Bucket決定的。
綜上,在固定了分桶列和分桶數(shù)后,同一個CG內(nèi)的表會擁有相同的Buckets Seq。而副本數(shù)決定了每個分桶內(nèi)的 Tablet 的多個副本分別存放在哪些 BE 上。假設(shè)Buckets Seq為 [0, 1, 2, 3, 4, 5, 6, 7],BE 節(jié)點有 [A, B, C, D] 4個。則一個可能的數(shù)據(jù)分布如下:
CG 內(nèi)表的一致的數(shù)據(jù)分布定義和tablet副本映射,能夠保證分桶列值相同的數(shù)據(jù)都在同一個 BE 節(jié)點上,可以進行本地數(shù)據(jù) Join。其核心思想是「兩次映射」,保證相同的 Distributed Key 的數(shù)據(jù)會被映射到相同的 Bucket Seq,再保證 Bucket Seq對應(yīng)的 Bucket 映射到相同的 BE 節(jié)點:
三、應(yīng)用案例
Colocation Join的使用案例見官網(wǎng):
Colocate Join | StarRocks本小節(jié)介紹如何使用 Colocate Join。
https://docs.starrocks.io/zh/docs/3.1/using_starrocks/Colocate_join/
參考文章:
Apache Doris的Colocation join本地join實現(xiàn)_colocation 怎么做-CSDN博客
第2.9章:StarRocks表設(shè)計--Colocation Join_show colocation_group-CSDN博客
Apache Doris Join 優(yōu)化原理介紹 - 掘金
編程小夢|Apache Doris Colocate Join 原理與實踐
到此這篇關(guān)于StarRocks數(shù)據(jù)庫查詢加速及Colocation Join工作原理的文章就介紹到這了,更多相關(guān)StarRocks查詢加速內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Flink同步Kafka數(shù)據(jù)到ClickHouse分布式表
這篇文章主要為大家介紹了Flink同步Kafka數(shù)據(jù)到ClickHouse分布式表實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12OceanBase自動生成回滾SQL的全過程(數(shù)據(jù)庫變更時)
在開發(fā)中,數(shù)據(jù)的變更與維護工作一般較頻繁,當我們執(zhí)行數(shù)據(jù)庫的DML操作時,必須謹慎考慮變更對數(shù)據(jù)可能產(chǎn)生的后果,以及變更是否能夠順利執(zhí)行,所以本文給大家介紹了數(shù)據(jù)庫變更時,OceanBase如何自動生成回滾 SQL,需要的朋友可以參考下2024-04-04深入解析NoSQL數(shù)據(jù)庫的分布式算法(圖文詳解)
這篇文章主要介紹了深入解析NoSQL數(shù)據(jù)庫的分布式算法,需要的朋友可以參考下2015-12-12postgres 數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)換
postgres8.3以后,字段數(shù)據(jù)之間的默認轉(zhuǎn)換取消了。如果需要進行數(shù)據(jù)變換的話,在postgres數(shù)據(jù)庫中,我們可以用"::"來進行字段數(shù)據(jù)的類型轉(zhuǎn)換。2009-07-07ms SQL server數(shù)據(jù)庫備份、壓縮與SQL數(shù)據(jù)庫數(shù)據(jù)處理的方法
ms SQL server數(shù)據(jù)庫備份、壓縮與SQL數(shù)據(jù)庫數(shù)據(jù)處理的方法...2007-07-07大數(shù)據(jù)量,海量數(shù)據(jù)處理方法總結(jié)
大數(shù)據(jù)量的問題是很多面試筆試中經(jīng)常出現(xiàn)的問題,比如baidu google 騰訊這樣的一些涉及到海量數(shù)據(jù)的公司經(jīng)常會問到。2010-11-11