最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Apache?Doris?Colocate?Join?原理實踐教程

 更新時間:2023年05月17日 11:18:00   作者:康凱森  
這篇文章主要為大家介紹了Apache?Doris?Colocate?Join?原理實踐教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

What Colocate Join

我們都知道 Join 的常見連接類型分為以下幾種:

  • INNER JOIN
  • OUTER JOIN
  • CROSS JOIN
  • SEMI JOIN
  • ANTI JOIN

Join 的常見算法實現(xiàn)包含以下幾種:

  • Nested Loop Join
  • Sort Merge Join
  • Hash Join

分布式系統(tǒng)實現(xiàn) Join 數(shù)據(jù)分布的常見策略有:

  • Shuffle Join
  • Broadcast Join
  • Colocate/Local Join

Colocate/Local Join 就是指多個節(jié)點 Join 時沒有數(shù)據(jù)移動和網(wǎng)絡(luò)傳輸,每個節(jié)點只在本地進(jìn)行 Join,能夠本地進(jìn)行 Join 的前提是相同 Join Key 的數(shù)據(jù)分布在相同的節(jié)點。

Why Colocate Join

相比 Shuffle Join 和 Broadcast Join,Colocate Join 在查詢時沒有數(shù)據(jù)的網(wǎng)絡(luò)傳輸,性能會更高。 在 Doris 的具體實現(xiàn)中,Colocate Join 相比 Shuffle Join 可以擁有更高的并發(fā)粒度,也可以顯著提升 Join 的性能,這一點在后面會解釋。

How Colocate Join

核心思路

對于 colocate tables,在任何情況下都要保證數(shù)據(jù)的本地性。 具體包括:

  • 數(shù)據(jù)導(dǎo)入時保證數(shù)據(jù)本地性
  • 查詢調(diào)度時保證數(shù)據(jù)本地性
  • 數(shù)據(jù) balance 后保證數(shù)據(jù)本地性

實現(xiàn)中最復(fù)雜是第 3 點: 處理 colocate tables 的 balance。

術(shù)語定義

Colocate Group

我們將一組具體相同 Colocate 屬性的 Table 稱為 Group,下圖中 t1 和 t2 擁有相同的 Colocate Group。

Colocate Parent Table

我們將決定一個 Group 數(shù)據(jù)分布的 Table 稱為 Parent Table,下圖中 t1 是 Colocate Parent Table.

Colocate Child Table

我們將一個 Group 中除 Parent Table 之外的 Table 稱為 Child Table,下圖中 t2 是 Colocate Child Table.

Bucket Seq

如下圖,如果一個表有 N 個 Partition, 則每個 Partition 的第 M 個 bucket 的 Bucket Seq 是 M。

1 數(shù)據(jù)導(dǎo)入時保證本地性

Doris 的分區(qū)方式如下所示,先根據(jù)分區(qū)字段 Range 分區(qū),再根據(jù)指定的 Distributed Key Hash 分桶:

所以我們在數(shù)據(jù)導(dǎo)入時保證本地性的核心思想就是兩次映射,對于 colocate tables,我們保證相同 Distributed Key 的數(shù)據(jù)映射到相同的 Bucket Seq,再保證相同 Bucket Seq 的 buckets 映射到相同的 BE。

具體來說,第一步:我們計算 Distributed Key 的 hash 值,并對 bucket num 取模,保證相同 Distributed Key 的數(shù)據(jù)映射到相同的 Bucket Seq。

第二步:將同一個 Colocate Group 下所有相同 Bucket Seq 的 Bucket 映射到相同的 BE,方法如下:

  • Group 中所有 Table 的 Bucket Seq 和 BE 節(jié)點的映射關(guān)系和 Parent Table 一致
  • Parent Table 中所有 Partition 的 Bucket Seq 和 BE 節(jié)點的映射關(guān)系和第一個 Partition 一致
  • Parent Table 第一個 Partition 的 Bucket Seq 和 BE 節(jié)點的映射關(guān)系利用原生的 Round Robin 算法決定

2 Colocate Join Query Plan

對 HashJoinFragment,由于 Join 的多張表有了數(shù)據(jù)本地性保證,所以可以去掉 Exchange Node,避免網(wǎng)絡(luò)傳輸,將 ScanNode 直接設(shè)置為 Hash Join Node 的 Child。

3 Colocate Join Query Schedule

查詢調(diào)度的目標(biāo): 一個 Colocate join 中所有 ScanNode 中所有 Bucket Seq 相同的 Buckets 被調(diào)度到同一個 BE。

查詢調(diào)度的策略:第一個 ScanNode 的 Buckets 隨機(jī)選擇 BE,其余的 ScanNode 和第一個 ScanNode 保持一致。

4 Colocate Join At Bucket Seq Level

目前,Doris 的 Hash Join 是 Server 粒度的:

對于 colocate join,由于同一個 Colocate Group 下相同 Bucket Seq 的 Bucket 分布在相同的 BE,所以我們將 Join 的粒度從 Server 粒度降至 Bucket Seq 粒度:

5 Colocate Join Metadata Maintenance

對于 colocate join,我們需要維護(hù)以下幾個核心元數(shù)據(jù):

  • 代碼中,colocate group id 就是 colocate parent table id
  • group2BackendsPerBucketSeq 代表每個 colocate group 中每個 bucket seq 映射到哪些 BE
  • 為了支持 balance,以及保證元數(shù)據(jù)的一致性,這些元數(shù)據(jù)都需要持久化

6 How to decide a query can colocate join

  • Join 的 tables 是 colocate able
  • The colocate group 是 stable 狀態(tài),沒有 balancing
  • Join 的 Key 包含分桶的 Distributed Key

7 Colocate Join Support Balance

核心思路

新增一個 daemon 線程專門處理 colocate table 的 balance,并讓正常的 balance 線程不處理 colocate table 的 balance。

何時 balance

有 BE 節(jié)點新增,刪除,down 掉時。

balance 的粒度

正常 balance 的粒度是 bucket,但是對于 colocate table,我們必須保證同一個 colocate group 下所有 bucket 的數(shù)據(jù)本地性,所以我們 balance 的單位是 colocate group。

balance 對查詢的影響

當(dāng)一個 colocate group 正在 balance 時,colocate join 會退化為原始的 shuffle join 或 broadcast join。

balance 流程:

  • 為需要復(fù)制或遷移的 Bucket 選擇目標(biāo) BE
  • 標(biāo)記 colocate group 的轉(zhuǎn)態(tài)為 balancing
  • 對于需要復(fù)制或遷移的 Bucket,發(fā)起 Clone Job,Clone Job 會從 Bucket 的現(xiàn)有副本復(fù)制一個新副本目標(biāo) BE
  • 更新 backendsPerBucketSeq(維護(hù) Bucket Seq 到 BE 映射關(guān)系的元數(shù)據(jù))
  • 當(dāng)一個 colocate group 下的所有 Clone Job 都完成時,標(biāo)記 colocate group 的轉(zhuǎn)態(tài)為 stable
  • 刪除冗余的副本

當(dāng)有 BE 節(jié)點刪除或長時間掛掉時,選擇目標(biāo) BE 的策略:

和正常 balance 時的選擇策略相同,考慮集群的整體負(fù)載,盡量選擇負(fù)載較低的 BE。

當(dāng)有 BE 節(jié)點新增時,選擇目標(biāo) BE 的策略:

  • 對于當(dāng)前 colocate group,計算每個新增 BE 需要增加的 bucket seqs 個數(shù):假如我們有 3 個 BE,8 個 bucket,每個 bucket 是 3 副本,則每個 BE 負(fù)責(zé) 8 個 bucket 副本,我們新增 1 個 BE 后,可以計算出每個 BE 負(fù)責(zé)的平均 bucket 副本數(shù)應(yīng)該是 3 * 8 / 4 = 6,每個新增 BE 需要增加的 bucket seqs 個數(shù)為 6 / 1 = 6.
  • 對于每個 bucket seqs, 隨機(jī)選擇從哪個舊的 BE 遷移副本到新增的 BE。

Colocate Join Performance

測試數(shù)據(jù):

Table A,B,C 都有 10 天數(shù)據(jù),1 天一個 partitions,每個 partition 有 570 萬數(shù)據(jù)。

測試集群:

4 臺低配物理機(jī),每個 BE 24CPU,96MEM

測試 SQL:

SQL1:

select count(*)  
FROM A t1
INNER JOIN [shuffle] B t5
   ON ((t1.dt = t5.dt) AND (t1.id = t5.id))
INNER JOIN [shuffle] C t6
   ON ((t1.dt = t6.dt) AND (t1.id = t6.id))
where t1.dt in (xxx days);

SQL2:

select t1.dt, t1.id, t1.name, t1.second_id,t1.second_name,
t5.id, t5.weight_time,t5.list,
t6.ord_id, t6._id
FROM A t1
INNER JOIN B t5
   ON ((t1.dt = t5.dt) AND (t1.id = t5.id))
INNER JOIN C t6
   ON ((t1.dt = t6.dt) AND (t1.id = t6.id))
where t1.dt in (xxx days)
limit 10000;

Test Result for SQL1:

Test Result for SQL2:

可以看到,Colocate Join 相比 Shuffle Join 有明顯的性能提升,而且隨著集群規(guī)模越大,Join 的數(shù)據(jù)量越多,Colocate Join 的優(yōu)勢會更明顯。

How To Use Colocate Join

社區(qū)最新代碼已經(jīng)支持 Colocate Join,只不過默認(rèn)是關(guān)閉的,只需要在 FE 配置中設(shè)置 disable_colocate_join 為 false,即可開啟 Colocate Join 功能。

具體使用時只需要在建表時增加 colocate_with 這個屬性即可,colocate_with 的值可以設(shè)置成同一組 colocate 表中的任意一個,不過需要保證 colocate_with 屬性中的表要先建立。

假如需要對 table t1 和 t2 進(jìn)行 Colocate Join,可以按以下語句建表:

CREATE TABLE `t1` (
  `id` int(11) COMMENT "",
  `value` varchar(8) COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"colocate_with" = "t1"
);


CREATE TABLE `t2` (
  `id` int(11) COMMENT "",
  `value` varchar(8) COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"colocate_with" = "t1"
);

Colocate Join 目前限制

  • Colocate Table 必須是 OLAP 類型的表
  • colocate_with 屬性相同表的 BUCKET 數(shù)必須一樣
  • colocate_with 屬性相同表的 副本數(shù)必須一樣 (這個限制之后可能會去掉,但對用戶應(yīng)該沒有實際影響)
  • colocate_with 屬性相同表的 DISTRIBUTED Columns 的數(shù)據(jù)類型必須一樣

Colocate Join 適用場景

Colocate Join 十分適合幾張表按照相同字段分桶,并高頻根據(jù)相同字段 Join 的場景,比如電商的不少應(yīng)用都按照商家 Id 分桶,并高頻按照商家 Id 進(jìn)行 Join。

Colocate Join FAQ

一句話總結(jié),凡是不能進(jìn)行 Colocate Join 的場景都會自動退化為原始的 Shuffle Join 或者 Broadcast Join。

Q1: 支持多張表進(jìn)行 Colocate Join 嗎?

A: 支持

Q2: 支持 Colocate 表和正常表 Join 嗎?

A: 支持

Q3: Colocate 表支持用非分桶的 Key 進(jìn)行 Join 嗎?

A: 支持:不符合 Colocate Join 條件的 Join 會使用 Shuffle Join 或 Broadcast Join

Q4: 如何確定 Join 是按照 Colocate Join 執(zhí)行的?

A: explain 的結(jié)果中 Hash Join 的孩子節(jié)點如果直接是 OlapScanNode, 沒有 Exchange Node,就說明是 Colocate Join

Q5: 如何修改 colocate_with 屬性?

A: ALTER TABLE example_db.my_table set ("colocate_with"="target_table");

Q6: 如何禁用 colocate join?

A: set disable_colocate_join = true; 就可以禁用 Colocate Join,查詢時就會使用 Shuffle Join 或 Broadcast Join

總結(jié)

大多數(shù)支持 Join 的 OLAP 系統(tǒng)都會考慮支持 Colocate Join,比如 MemSQL, SnappyData, 阿里 AnalyticDB 等,阿里 AnalyticDB 更是在數(shù)據(jù)模型中就引入了 Table Group 的概念。總的來講,Colocate Join 通過在數(shù)據(jù)導(dǎo)入,查詢 Plan,查詢調(diào)度,數(shù)據(jù) balance 時對數(shù)據(jù)本地性的保證和考慮,可以顯著加速特定場景的下 Join 查詢,是一個十分有用的 Feature。

以上就是Apache Doris Colocate Join 原理實踐教程的詳細(xì)內(nèi)容,更多關(guān)于Apache Doris Colocate Join 原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在PostgreSQL中實現(xiàn)遞歸查詢的教程

    在PostgreSQL中實現(xiàn)遞歸查詢的教程

    這篇文章主要介紹了在PostgreSQL中實現(xiàn)遞歸查詢的教程,包括在遞歸查詢內(nèi)排序等方法的介紹,需要的朋友可以參考下
    2015-04-04
  • 數(shù)據(jù)庫sql查詢性能優(yōu)化詳解

    數(shù)據(jù)庫sql查詢性能優(yōu)化詳解

    這篇文章主要介紹了數(shù)據(jù)庫sql查詢性能優(yōu)化詳解,查詢優(yōu)化的本質(zhì)是讓數(shù)據(jù)庫優(yōu)化器為SQL語句選擇最佳的執(zhí)行計劃,對于大型的應(yīng)用系統(tǒng),大量的數(shù)據(jù)當(dāng)然需要效率最快的執(zhí)行語句,需要的朋友可以參考下
    2023-07-07
  • OceanBase自動生成回滾SQL的全過程(數(shù)據(jù)庫變更時)

    OceanBase自動生成回滾SQL的全過程(數(shù)據(jù)庫變更時)

    在開發(fā)中,數(shù)據(jù)的變更與維護(hù)工作一般較頻繁,當(dāng)我們執(zhí)行數(shù)據(jù)庫的DML操作時,必須謹(jǐn)慎考慮變更對數(shù)據(jù)可能產(chǎn)生的后果,以及變更是否能夠順利執(zhí)行,所以本文給大家介紹了數(shù)據(jù)庫變更時,OceanBase如何自動生成回滾 SQL,需要的朋友可以參考下
    2024-04-04
  • 大數(shù)據(jù)量時提高分頁的效率

    大數(shù)據(jù)量時提高分頁的效率

    當(dāng)我們在處理大量數(shù)據(jù)的時候,就需要注意分頁的效率問題了,下面大家可以看看
    2009-03-03
  • 深入理解數(shù)據(jù)庫之表的唯一、自增等七大約束

    深入理解數(shù)據(jù)庫之表的唯一、自增等七大約束

    真正約束字段的是數(shù)據(jù)類型,但是數(shù)據(jù)類型約束很單一,需要有一些額外的約束,更好的保證數(shù)據(jù)的合法性,從業(yè)務(wù)邏輯角度保證數(shù)據(jù)的正確性,本文就來介紹一下數(shù)據(jù)庫之表的唯一、自增等七大約束,感興趣的可以了解一下
    2023-09-09
  • 一文弄懂?dāng)?shù)據(jù)庫設(shè)計的三范式

    一文弄懂?dāng)?shù)據(jù)庫設(shè)計的三范式

    面試中經(jīng)常會問到的數(shù)據(jù)庫三范式指的是什么,本文主要介紹了數(shù)據(jù)庫設(shè)計的三范式,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 一篇文章帶你了解數(shù)據(jù)庫中JOIN的用法

    一篇文章帶你了解數(shù)據(jù)庫中JOIN的用法

    這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫中JOIN的用法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用數(shù)據(jù)庫具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SQLServer中exists和except用法介紹

    SQLServer中exists和except用法介紹

    大家好,本篇文章主要講的是SQLServer中exists和except用法介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下哦
    2021-12-12
  • 關(guān)于sql注入的簡要演示(入坑拋磚)

    關(guān)于sql注入的簡要演示(入坑拋磚)

    這篇文章主要介紹了關(guān)于sql注入的簡要演示(入坑拋磚),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 問個高難度的復(fù)雜查詢(在一個時間段內(nèi)的間隔查詢)

    問個高難度的復(fù)雜查詢(在一個時間段內(nèi)的間隔查詢)

    問個高難度的復(fù)雜查詢(在一個時間段內(nèi)的間隔查詢)...
    2007-04-04

最新評論

台中县| 武强县| 汝州市| 东光县| 吴堡县| 中卫市| 融水| 五原县| 黑龙江省| 新余市| 闻喜县| 江安县| 丽江市| 黄浦区| 文化| 加查县| 浙江省| 南投县| 衡阳市| 锦州市| 盐亭县| 恭城| 湖南省| 明溪县| 台中市| 龙海市| 竹山县| 屯门区| 牙克石市| 江安县| 古浪县| 登封市| 科尔| 全南县| 江陵县| 应城市| 峨边| 阳高县| 张家口市| 洪江市| 章丘市|