返回顶部
首页 > 资讯 > 精选 >Apache Doris Colocate Join原理是什么
  • 393
分享到

Apache Doris Colocate Join原理是什么

2023-07-04 11:07:38 393人浏览 独家记忆
摘要

这篇文章主要介绍“Apache Doris Colocate Join原理是什么”,在日常操作中,相信很多人在Apache Doris Colocate Join原理是什么问题上存

这篇文章主要介绍“Apache Doris Colocate Join原理是什么”,在日常操作中,相信很多人在Apache Doris Colocate Join原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Apache Doris Colocate Join原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    What Colocate Join

    我们都知道 Join 的常见连接类型分为以下几种:

    • INNER JOIN

    • OUTER JOIN

    • CROSS JOIN

    • SEMI JOIN

    • ANTI JOIN

    Join 的常见算法实现包含以下几种:

    • Nested Loop Join

    • Sort Merge Join

    • Hash Join

    分布式系统实现 Join 数据分布的常见策略有:

    • Shuffle Join

    • Broadcast Join

    • Colocate/Local Join

    Colocate/Local Join 就是指多个节点 Join 时没有数据移动和网络传输,每个节点只在本地进行 Join,能够本地进行 Join 的前提是相同 Join Key 的数据分布在相同的节点。

    Why Colocate Join

    相比 Shuffle Join 和 Broadcast Join,Colocate Join 在查询时没有数据的网络传输,性能会更高。 在 Doris 的具体实现中,Colocate Join 相比 Shuffle Join 可以拥有更高的并发粒度,也可以显著提升 Join 的性能,这一点在后面会解释。

    How Colocate Join

    核心思路

    对于 colocate tables,在任何情况下都要保证数据的本地性。 具体包括:

    • 数据导入时保证数据本地性

    • 查询调度时保证数据本地性

    • 数据 balance 后保证数据本地性

    实现中最复杂是第 3 点: 处理 colocate tables 的 balance。

    术语定义

    Colocate Group

    我们将一组具体相同 Colocate 属性的 Table 称为 Group,下图中 t1 和 t2 拥有相同的 Colocate Group。

    Colocate Parent Table

    我们将决定一个 Group 数据分布的 Table 称为 Parent Table,下图中 t1 是 Colocate Parent Table.

    Colocate Child Table

    我们将一个 Group 中除 Parent Table 之外的 Table 称为 Child Table,下图中 t2 是 Colocate Child Table.

    Apache Doris Colocate Join原理是什么

    Bucket Seq

    如下图,如果一个表有 N 个 Partition, 则每个 Partition 的第 M 个 bucket 的 Bucket Seq 是 M。

    Apache Doris Colocate Join原理是什么

    1 数据导入时保证本地性

    Doris 的分区方式如下所示,先根据分区字段 Range 分区,再根据指定的 Distributed Key Hash 分桶:

    Apache Doris Colocate Join原理是什么

    所以我们在数据导入时保证本地性的核心思想就是两次映射,对于 colocate tables,我们保证相同 Distributed Key 的数据映射到相同的 Bucket Seq,再保证相同 Bucket Seq 的 buckets 映射到相同的 BE。

    Apache Doris Colocate Join原理是什么

    具体来说,第一步:我们计算 Distributed Key 的 hash 值,并对 bucket num 取模,保证相同 Distributed Key 的数据映射到相同的 Bucket Seq。

    Apache Doris Colocate Join原理是什么

    将同一个 Colocate Group 下所有相同 Bucket Seq 的 Bucket 映射到相同的 BE,方法如下:

    • Group 中所有 Table 的 Bucket Seq 和 BE 节点的映射关系和 Parent Table 一致

    • Parent Table 中所有 Partition 的 Bucket Seq 和 BE 节点的映射关系和第一个 Partition 一致

    • Parent Table 第一个 Partition 的 Bucket Seq 和 BE 节点的映射关系利用原生的 Round Robin 算法决定

    Apache Doris Colocate Join原理是什么

    2 Colocate Join Query Plan

    对 HashJoinFragment,由于 Join 的多张表有了数据本地性保证,所以可以去掉 Exchange node,避免网络传输,将 ScanNode 直接设置为 Hash Join Node 的 Child。

    Apache Doris Colocate Join原理是什么

    3 Colocate Join Query Schedule

    查询调度的目标: 一个 Colocate join 中所有 ScanNode 中所有 Bucket Seq 相同的 Buckets 被调度到同一个 BE。

    查询调度的策略:第一个 ScanNode 的 Buckets 随机选择 BE,其余的 ScanNode 和第一个 ScanNode 保持一致。

    4 Colocate Join At Bucket Seq Level

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

    Apache Doris Colocate Join原理是什么

    对于 colocate join,由于同一个 Colocate Group 下相同 Bucket Seq 的 Bucket 分布在相同的 BE,所以我们将 Join 的粒度从 Server 粒度降至 Bucket Seq 粒度:

    Apache Doris Colocate Join原理是什么

    5 Colocate Join Metadata Maintenance

    对于 colocate join,我们需要维护以下几个核心元数据:

    Apache Doris Colocate Join原理是什么

    • 代码中,colocate group id 就是 colocate parent table id

    • group2BackendsPerBucketSeq 代表每个 colocate group 中每个 bucket seq 映射到哪些 BE

    • 为了支持 balance,以及保证元数据的一致性,这些元数据都需要持久化

    6 How to decide a query can colocate join

    • Join 的 tables 是 colocate able

    • The colocate group 是 stable 状态,没有 balancing

    • Join 的 Key 包含分桶的 Distributed Key

    7 Colocate Join Support Balance

    核心思路

    新增一个 daemon 线程专门处理 colocate table 的 balance,并让正常的 balance 线程不处理 colocate table 的 balance。

    何时 balance

    有 BE 节点新增,删除,down 掉时。

    balance 的粒度

    正常 balance 的粒度是 bucket,但是对于 colocate table,我们必须保证同一个 colocate group 下所有 bucket 的数据本地性,所以我们 balance 的单位是 colocate group。

    balance 对查询的影响

    当一个 colocate group 正在 balance 时,colocate join 会退化为原始的 shuffle join 或 broadcast join。

    balance 流程:

    • 为需要复制或迁移的 Bucket 选择目标 BE

    • 标记 colocate group 的转态为 balancing

    • 对于需要复制或迁移的 Bucket,发起 Clone Job,Clone Job 会从 Bucket 的现有副本复制一个新副本目标 BE

    • 更新 backendsPerBucketSeq(维护 Bucket Seq 到 BE 映射关系的元数据)

    • 当一个 colocate group 下的所有 Clone Job 都完成时,标记 colocate group 的转态为 stable

    • 删除冗余的副本

    当有 BE 节点删除或长时间挂掉时,选择目标 BE 的策略:

    和正常 balance 时的选择策略相同,考虑集群的整体负载,尽量选择负载较低的 BE。

    当有 BE 节点新增时,选择目标 BE 的策略:

    • 对于当前 colocate group,计算每个新增 BE 需要增加的 bucket seqs 个数:假如我们有 3 个 BE,8 个 bucket,每个 bucket 是 3 副本,则每个 BE 负责 8 个 bucket 副本,我们新增 1 个 BE 后,可以计算出每个 BE 负责的平均 bucket 副本数应该是 3 * 8 / 4 = 6,每个新增 BE 需要增加的 bucket seqs 个数为 6 / 1 = 6.

    • 对于每个 bucket seqs, 随机选择从哪个旧的 BE 迁移副本到新增的 BE。

    Colocate Join PerfORMance

    测试数据:

    Table A,B,C 都有 10 天数据,1 天一个 partitions,每个 partition 有 570 万数据。

    测试集群:

    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:

    Apache Doris Colocate Join原理是什么

    Test Result for SQL2:

    Apache Doris Colocate Join原理是什么

    可以看到,Colocate Join 相比 Shuffle Join 有明显的性能提升,而且随着集群规模越大,Join 的数据量越多,Colocate Join 的优势会更明显。

    How To Use Colocate Join

    社区最新代码已经支持 Colocate Join,只不过默认是关闭的,只需要在 FE 配置中设置 disable_colocate_join 为 false,即可开启 Colocate Join 功能。

    具体使用时只需要在建表时增加 colocate_with 这个属性即可,colocate_with 的值可以设置成同一组 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 数必须一样

    • colocate_with 属性相同表的 副本数必须一样 (这个限制之后可能会去掉,但对用户应该没有实际影响)

    • colocate_with 属性相同表的 DISTRIBUTED Columns 的数据类型必须一样

    Colocate Join 适用场景

    Colocate Join 十分适合几张表按照相同字段分桶,并高频根据相同字段 Join 的场景,比如电商的不少应用都按照商家 Id 分桶,并高频按照商家 Id 进行 Join。

    Colocate Join FAQ

    一句话总结凡是不能进行 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 执行的?

    A: explain 的结果中 Hash Join 的孩子节点如果直接是 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

    到此,关于“Apache Doris Colocate Join原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Apache Doris Colocate Join原理是什么

    本文链接: https://lsjlt.com/news/344723.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Apache Doris Colocate Join原理是什么
      这篇文章主要介绍“Apache Doris Colocate Join原理是什么”,在日常操作中,相信很多人在Apache Doris Colocate Join原理是什么问题上存...
      99+
      2023-07-04
    • Apache Doris Colocate Join 原理实践教程
      目录What Colocate JoinWhy Colocate JoinHow Colocate Join核心思路术语定义1 数据导入时保证本地性2 Colocate Join Query Plan3 Colocate...
      99+
      2024-04-02
    • Apache Doris Join 优化原理详解
      目录背景 & 目标Doris 数据划分PartitionBucketJoin 方式总览Broadcast / Shuffle JoinBucket Shuffle JoinP...
      99+
      2022-11-13
      Apache Doris Join 优化 Apache Doris Join
    • Doris Join 优化原理文档详解
      目录Doris Join 优化原理Doris Shuffle 方式四种 Shuffle 方式对比Runtime Filter Join 优化Runtime Filter 类型Join ReorderDoris Join ...
      99+
      2024-04-02
    • Fork跟Join原理是什么
      这篇文章将为大家详细讲解有关Fork跟Join原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。只听到P8大佬不急不慢问道:谈谈对JDK并发工具的认识...
      99+
      2024-04-02
    • 浅谈mysql join底层原理是什么
      本篇内容主要讲解“浅谈mysql join底层原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“浅谈mysql join底层原理是什么”吧!目录join算法驱动表和非驱动表的区别Simpl...
      99+
      2023-06-20
    • Mysql连接join查询的原理是什么
      Mysql连接join查询的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Mysql连接(join)查询1、基本概念将两个表的每...
      99+
      2024-04-02
    • Left join的概念与执行原理是什么
      这篇文章给大家介绍Left join的概念与执行原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。join 是 SQL查询中很常见的一种操作,具体来讲有join,left joi...
      99+
      2024-04-02
    • MYSQL数据库中Join的操作原理是什么
      今天就跟大家聊聊有关MYSQL数据库中Join的操作原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Join使用的是Nested-Loop Join算法,Nested-Loo...
      99+
      2023-06-20
    • 使用DataAnt监控Apache APISIX的原理是什么
      这篇文章主要介绍“使用DataAnt监控Apache APISIX的原理是什么”,在日常操作中,相信很多人在使用DataAnt监控Apache APISIX的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
      99+
      2023-07-02
    • Apache Kafka分区重分配的实现原理是什么
      这篇文章主要介绍了Apache Kafka分区重分配的实现原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Apache Kafka分区重分配的实现原理是什么文章都会有所收获,下面我们...
      99+
      2023-07-02
    • mysql中的join是什么
      mysql 中的 join 是用于组合不同表数据的查询命令,它通过匹配列创建临时表。join 有四种类型:inner join(仅匹配两表中都存在的行)、left join(选择左表所有...
      99+
      2024-04-29
      mysql
    • Metrics原理是什么
      本篇内容主要讲解“Metrics原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Metrics原理是什么”吧!什么是 Metrics?Flink 提供的...
      99+
      2024-04-02
    • JSX原理是什么
      本篇内容介绍了“JSX原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
      99+
      2024-04-02
    • immer.js原理是什么
      这篇文章主要介绍了immer.js原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇immer.js原理是什么文章都会有所收获,下面我们一起来看看吧。但如果拷贝的是一个树形结构,层次比较深,看是一个对象,...
      99+
      2023-07-05
    • 什么是Apache Beam
      本篇内容介绍了“什么是Apache Beam”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 概述在本教...
      99+
      2024-04-02
    • Apache Mesos是什么
      这篇文章主要介绍了Apache Mesos是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Apache Mesos 就是这样一种“pre-Kubernetes”平台。Me...
      99+
      2023-06-15
    • Apache Ant是什么
      这篇文章主要为大家展示了“Apache Ant是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Apache Ant是什么”这篇文章吧。什么是AntApache Ant是一个基于Java的构建...
      99+
      2023-06-17
    • Apache Pulsar是什么
      这篇文章主要讲解了“Apache Pulsar是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Apache Pulsar是什么”吧!Pulsar简介Apache Pulsar是一个企业级...
      99+
      2023-06-19
    • 什么是Apache Cassandra
      Apache Cassandra是一个开源的分布式数据库系统,最初由Facebook开发并开源。它被设计成高度可扩展、高性能、高可用...
      99+
      2024-03-06
      Cassandra
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作