成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

Apache Doris Colocate Join 原理實踐教程

瀏覽:161日期:2023-03-07 14:40:44
目錄
  • What Colocate Join
  • Why Colocate Join
  • How Colocate Join
    • 核心思路
    • 術(shù)語定義
    • 1 數(shù)據(jù)導(dǎo)入時保證本地性
    • 2 Colocate Join Query Plan
    • 3 Colocate Join Query Schedule
    • 4 Colocate Join At Bucket Seq Level
    • 5 Colocate Join Metadata Maintenance
    • 6 How to decide a query can colocate join
    • 7 Colocate Join Support Balance
  • Colocate Join Performance
    • How To Use Colocate Join
      • Colocate Join 目前限制
      • Colocate Join 適用場景
      • Colocate Join FAQ
    • 總結(jié)

      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é)點只在本地進行 Join,能夠本地進行 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)度的目標: 一個 Colocate join 中所有 ScanNode 中所有 Bucket Seq 相同的 Buckets 被調(diào)度到同一個 BE。

      查詢調(diào)度的策略:第一個 ScanNode 的 Buckets 隨機選擇 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,我們需要維護以下幾個核心元數(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 選擇目標 BE
      • 標記 colocate group 的轉(zhuǎn)態(tài)為 balancing
      • 對于需要復(fù)制或遷移的 Bucket,發(fā)起 Clone Job,Clone Job 會從 Bucket 的現(xiàn)有副本復(fù)制一個新副本目標 BE
      • 更新 backendsPerBucketSeq(維護 Bucket Seq 到 BE 映射關(guān)系的元數(shù)據(jù))
      • 當(dāng)一個 colocate group 下的所有 Clone Job 都完成時,標記 colocate group 的轉(zhuǎn)態(tài)為 stable
      • 刪除冗余的副本

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

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

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

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

      Colocate Join Performance

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

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

      測試集群:

      4 臺低配物理機,每個 BE 24CPU,96MEM

      測試 SQL:

      SQL1:

      select count(*)  FROM A t1INNER 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._idFROM A t1INNER 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,只不過默認是關(guān)閉的,只需要在 FE 配置中設(shè)置 disable_colocate_join 為 false,即可開啟 Colocate Join 功能。

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

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

      CREATE TABLE `t1` (  `id` int(11) COMMENT "",  `value` varchar(8) COMMENT "") ENGINE=OLAPDUPLICATE KEY(`id`)DISTRIBUTED BY HASH(`id`) BUCKETS 10PROPERTIES ("colocate_with" = "t1");CREATE TABLE `t2` (  `id` int(11) COMMENT "",  `value` varchar(8) COMMENT "") ENGINE=OLAPDUPLICATE KEY(`id`)DISTRIBUTED BY HASH(`id`) BUCKETS 10PROPERTIES ("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 進行 Join。

      Colocate Join FAQ

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

      Q1: 支持多張表進行 Colocate Join 嗎?

      A: 支持

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

      A: 支持

      Q3: Colocate 表支持用非分桶的 Key 進行 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 原理實踐教程的詳細內(nèi)容,更多關(guān)于Apache Doris Colocate Join 原理的資料請關(guān)注其它相關(guān)文章!

      標簽: Linux Apache
      相關(guān)文章:
      成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
      一区二区三区你懂的| 在线免费观看成人短视频| 欧美伊人精品成人久久综合97| 国产激情精品久久久第一区二区 | 亚洲午夜激情av| 一区二区国产日产| 国产精品久久网站| 国产一区免费视频| 国产成人精品免费网站| 视频一区欧美精品| 亚洲欧洲色图综合| 久久综合久久综合亚洲| 91精品国产色综合久久不卡电影| 狂野欧美一区| 午夜在线精品偷拍| 今天的高清视频免费播放成人| 91影视在线播放| 成人动漫精品一区二区| www..com久久爱| 欧美视频中文字幕| 国产一区二区三区在线观看精品 | 国产宾馆实践打屁股91| 日韩电影在线观看电影| 一区二区欧美国产| 亚洲精品亚洲人成人网| 18成人在线观看| 国产精品久久久久久久蜜臀| 久久天天做天天爱综合色| 日韩精品影音先锋| 日韩欧美一区二区久久婷婷| 激情偷拍久久| 亚洲综合色丁香婷婷六月图片| 欧美性久久久| 最新中文字幕一区二区三区| 国产精品亚洲综合| 蜜臀久久99精品久久久画质超高清| 国产精品久久久久久一区二区三区| 久久久久久国产精品一区| 国产精品久久久对白| 六月天综合网| 欧美午夜宅男影院| 欧美电视剧在线观看完整版| 欧美精品一区二区三| 久久久久久久久久久久久久久99| 久久久国产精品午夜一区ai换脸| 精品国产自在久精品国产| 亚洲欧美日韩精品在线| 亚洲私人黄色宅男| 老司机久久99久久精品播放免费| 国产一区二区主播在线| 中文字幕精品一区二区三区精品| 91老师国产黑色丝袜在线| 热久久一区二区| 成人午夜激情在线| 亚洲第一在线综合在线| 在线一区二区三区| 欧美成人免费网站| 亚洲精品国产一区二区三区四区在线| 午夜久久电影网| 国产成人自拍网| 合欧美一区二区三区| 日韩午夜av| 日韩午夜在线影院| 亚洲自拍另类| 久久精品99国产精品日本| 日韩欧美美女一区二区三区| 亚洲成人在线| 久久99在线观看| gogogo免费视频观看亚洲一| 亚洲精品成人精品456| 久久99久久99| 激情视频一区二区| 色国产精品一区在线观看| 精品国产一区二区国模嫣然| 一区二区成人在线观看| 国产v日产∨综合v精品视频| av激情亚洲男人天堂| 亚洲一区久久| 亚洲精品在线免费播放| 精品二区视频| 日本欧美一区二区在线观看| 久久精品日韩一区二区三区| 色综合久久88色综合天天免费| 日韩精品一区二区三区中文不卡| 久久亚洲精精品中文字幕早川悠里| 亚洲乱码一区二区三区在线观看| 美女网站色91| 亚洲经典三级| 久久影音资源网| 精品一区二区三区免费播放| 99精品免费| 欧美一区二区久久| 五月婷婷色综合| 狠狠色综合网站久久久久久久| 欧美人狂配大交3d怪物一区| 亚洲靠逼com| 久久亚洲免费视频| 欧美色涩在线第一页| 日韩视频在线播放| eeuss影院一区二区三区| 精品在线播放午夜| 鲁大师影院一区二区三区| 久久久国产精品麻豆| 国产伦精品一区二区三区视频青涩 | 美国毛片一区二区| 国产欧美精品| 亚洲素人一区二区| 午夜精品视频| wwwwww.欧美系列| 国产乱码精品一区二区三区忘忧草| 午夜宅男欧美| 亚洲一区二区三区在线看 | 国产欧美一区二区三区鸳鸯浴 | 亚洲午夜精品福利| 国产欧美日产一区| 成人美女视频在线观看| 欧美日韩免费观看一区三区| 亚洲成人精品影院| 国产一区白浆| 国产亚洲综合在线| 色综合天天综合网国产成人综合天 | 欧美一卡2卡3卡4卡| 国内精品伊人久久久久av影院| 久久久久久网| 日韩av一区二| 欧美日韩卡一卡二| 韩国av一区二区三区四区 | 国产呦萝稀缺另类资源| 欧美丝袜丝nylons| 免费成人性网站| 欧美三级三级三级| 久久国产精品色婷婷| 色哟哟在线观看一区二区三区| 亚洲国产成人tv| 蜜桃精品久久久久久久免费影院| 亚洲高清不卡在线观看| 麻豆精品网站| 日本aⅴ精品一区二区三区 | 国产成人夜色高潮福利影视| 在线播放欧美女士性生活| 国产老妇另类xxxxx| 精品三级在线观看| 欧美在线网站| 亚洲欧洲制服丝袜| 欧美日本国产精品| 一区二区三区四区高清精品免费观看 | 欧美日韩国产综合草草| 国产大片一区二区| 日本一区二区三区四区| 亚洲毛片一区| 欧美aaa在线| 欧美电影免费观看高清完整版在线| av亚洲产国偷v产偷v自拍| 久久五月婷婷丁香社区| 亚洲日本黄色| 激情综合亚洲精品| 2021国产精品久久精品| 极品av少妇一区二区| 丝袜脚交一区二区| 精品福利av导航| 一本色道久久精品| 麻豆精品蜜桃视频网站| 久久久不卡网国产精品二区| 国产欧美日韩伦理| 国产精品1区二区.| 亚洲欧美综合在线精品| 欧美午夜精品一区| 国内精品嫩模av私拍在线观看| 日本怡春院一区二区| 国产女主播在线一区二区| 校园春色综合网| 91亚洲精品一区二区乱码| 一级特黄大欧美久久久| 欧美久久久久久久久中文字幕| 欧美特黄视频| 国产一区二区三区av电影| 欧美一区二区视频在线观看| 亚洲第一伊人| 成人午夜视频网站| 亚洲va国产天堂va久久en| 欧美一级视频精品观看| 国产欧美不卡| 94色蜜桃网一区二区三区| 免费成人av在线播放| 亚洲欧洲日韩综合一区二区| 欧美日韩精品一区二区三区蜜桃| 欧美日韩亚洲一区| 国产aⅴ综合色| 午夜精品久久久久久久久久久 | 99精品桃花视频在线观看| 亚洲电影第三页| 亚洲国产精品高清| 欧美日韩国产另类一区| 亚洲欧洲一区二区在线观看| 国产精一区二区三区| 亚洲国产日韩一级| 国产精品久久久久aaaa| 日韩欧美国产小视频| 欧美亚洲动漫精品| 亚洲国产一区二区三区在线播 |