问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ApachenbspDorisnbspColocatenbspJoinnbsp原理实践教程

发布网友 发布时间:2024-10-02 08:32

我来回答

1个回答

热心网友 时间:2024-11-08 15:07

What Colocate Join我们都知道 Join 的常见连接类型分为以下几种:
INNER JOINOUTER JOINCROSS JOINSEMI JOINANTI JOIN
Join 的常见算法实现包含以下几种:
Nested Loop JoinSort Merge JoinHash Join
分布式系统实现 Join 数据分布的常见策略有:
Shuffle JoinBroadcast JoinColocate/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.

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

1 数据导入时保证本地性
Doris 的分区方式如下所示,先根据分区字段 Range 分区,再根据指定的 Distributed Key Hash 分桶:

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

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

第二步:将同一个 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 算法决定

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

3 Colocate Join Query Schele
查询调度的目标: 一个 Colocate join 中所有 ScanNode 中所有 Bucket Seq 相同的 Buckets 被调度到同一个 BE。
查询调度的策略:第一个 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,我们需要维护以下几个核心元数据:

代码中,colocate group id 就是 colocate parent table idgroup2BackendsPerBucketSeq 代表每个 colocate group 中每个 bucket seq 映射到哪些 BE为了支持 balance,以及保证元数据的一致性,这些元数据都需要持久化

6 How to decide a query can colocate joinJoin 的 tables 是 colocate ableThe colocate group 是 stable 状态,没有 balancingJoin 的 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 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 ( 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 ( days)
limit 10000;
Test Result for SQL1:

Test Result for SQL2:

可以看到,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=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 数必须一样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

总结
大多数支持 Join 的 OLAP 系统都会考虑支持 Colocate Join,比如 MemSQL, SnappyData, 阿里 AnalyticDB 等,阿里 AnalyticDB 更是在数据模型中就引入了 Table Group 的概念。总的来讲,Colocate Join 通过在数据导入,查询 Plan,查询调度,数据 balance 时对数据本地性的保证和考虑,可以显著加速特定场景的下 Join 查询,是一个十分有用的 Feature。
以上就是Apache Doris Colocate Join 原理实践教程的详细内容,更多关于Apache Doris Colocate Join 原理的资料请关注其它相关文章!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
干货| 手把手教你搭建一套OpenStack云平台 口碑最好的切菜刀 什么材质的菜刀最好用 菜刀的种类和用途 张九龄三首古诗词赏析(风格清淡,语言素练) word文字底纹颜色怎么设置在哪 东施效颦这则语言告诉人们一个怎样的道理,欲意又是什么呢 胜芳买房多少钱 胜芳谁最有钱 315儿童智能手表是哪个牌子 孕囊看男女准不准 怎样做尖椒土豆丝会更好吃? 如何才能做出美味的尖椒土豆丝? 尖椒土豆丝怎样做才能让它的口感更佳? 烹饪尖椒土豆丝的正确步骤是什么? 怎样炒尖椒土豆丝更入味? 怎样烹饪尖椒土豆丝可以使它的口味更加特别? 脸有点婴儿肥的女生怎么穿搭,让我们学学她 脸蛋是婴儿肥怎样减下去? 你的微信号被冻结以后你的好友是不是就给你微信号发不了信息 港澳通行证再次签注如何办理 微信号冻结了,别人还能给你发微信吗? ...桌面后得半天才出右下角那些东西 好慢 谁知道怎么解决啊? ...把桌面上其他的也全卸载了,怎么找回那些其他的文件啊 我的文档在桌面找不到了,把属性那里的勾上也没显示出来怎么整啊?_百 ... ...但是还在系统中存在,文件夹选项那个不好使,怎么办啊,开始菜单中运行... 怎样把桌面的文件夹 移到 桌面的某个角落 而文件夹 也在那 谁知道怎么... 保温杯材质哪种最安全保温杯材质什么最安全 哪种水杯最保温时间最长保温杯用什么材质最保温 耐磨弯头详细介绍性能及工艺 235*3.5mm拼接弯头能承受多大压力 迷失森林修改器6绿色免费版迷失森林修改器6绿色免费版功能简介_百度知 ... 为什么启动电脑时按F11键没法进入一键还原精灵 一键还原精灵安装完成后按F11键无法进入还原界面,出现Ctrl+Alt+Del... 一键还原精灵停留在选择F11画面,按F11也动不了。请求高手支援。_百度知 ... 我安装了一键还原精灵重起后按f11进不去怎么办 一直按F11没有看到一键还原精灵 一键还原精灵为什么从起机时按F11无法进入 古剑奇谭木语人测试预约问卷答案介绍_古剑奇谭木语人测试预约问卷答案是... 电视剧《古剑奇谭》血露薇组织大姐的扮演者是谁 古剑奇谭中血露薇组织的大姐是谁 古剑奇谭客串演员血露薇 忍者必须死3忍界乱斗怎么吃鸡 忍界乱斗攻略 忍者必须死3忍界乱斗卡牌怎么获得_忍者必须死3忍界乱斗卡牌获取攻略... ...证照身份证号码手机号家庭住址银行卡(不知道... ...的银行卡,被骗子骗到了银行卡号,姓名,身份证号,家庭住址和卡里面的... 如果我的身份证正反面截图,身份证号,办理银行卡的手机号,还有家庭住 ... 送梳子的寓意是什么 怎样让手机版百度只留搜索框 酷派手机怎么让百度条框留在屏幕上呢 第五人格摄影师约瑟夫玩法解读 拍照时机掌握技巧