MO干货 | shuffle执行计划解析(上篇)

本文详细解释了MatrixOne中shuffle算法的实现原理,包括MergeGroup和ShuffleGroup,以及为何需要支持shuffle。重点介绍了Colocateshuffle优化,如何减少网络传输开销并提升性能。此外,还讨论了MOPipeline中shuffle算子和dispatch算子的角色,以及如何在不同算子如load、scan、group和join中启用shuffle。MatrixOne作为一款云原生多模数据库,其Colocateshuffle的优势在于自动统计信息处理和无缝适应不同并发和CN数的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:倪涛 

MO产品布道师

目录

Part 1. 背景

Part 2. Shuffle实现原理

Part 3. Colocate shuffle


Part 1 背景

shuffle算法的基本原理,就是给输入的数据进行分桶,每个桶内的数据都可以单独处理并且输出结果。这样可以减少汇总数据时hash表的大小。

以group算子为例,实现方式有sort group和hash group两种。hash group在多并发时,每个并发都会对输入数据进行hash并放到hash表中进行处理。所有hash表需要汇总到一起再做一次merge,以得到最终结果。这种方式叫做merge group。另外一种方式是先将数据进行shuffle分发,每个并发接收并处理不同的数据,并且直接输出结果,不需要将hash表merge到一起。这种方式叫做shuffle group。

为什么需要支持shuffle?原因主要有以下三点。:

  1. 解决hash表太大导致分配内存失败的问题:以merge group为例,由于需要将所有数据merge到一起,如果最后merge的hash表基数太大,则需要分配的内存就会非常大,会导致分配内存失败。如果超过单CN(compute node, 表示计算节点)的内存上限,且不考虑spill的情况下,还会导致oom。而shuffle则可以将一个大的hash表切分成多个小的hash表进行处理。
  2. 提高计算节点的横向扩展性:仍以merge group为例,由于需要将所有数据merge到一起,在单CN上进行单并发处理。如果hash表基数比较大,这一步处理比较慢,就会成为瓶颈,即使增加再多CN也无法加速这样的query。而shuffle group则不存在这样的单点瓶颈。
  3. 提升性能:当hash表太大时,随机访问hash表会导致非常高的cache miss概率,而cache miss会导致性能显著下降。通过shuffle将hash表切分成多个小hash表进行处理,对每个小hash表的随机访问cache命中率大大提高,进而提升整体性能。

Part 2 Shuffle实现原理

shuffle对数据进行分桶,桶的数目在编译pipeline(在执行阶段,算子被组成流水线来执行。一道流水线被称为一个pipeline)时,由运行环境的CN数量,CPU核数动态决定。例如当前租户的环境是3CN,每个CN10核,shuffle算子会自动计算分桶数量为30。

shuffle的分桶算法有两种,range shuffle和hash shuffle。hash shuffle直接通过一个hash函数得到数据的分桶号。range shuffle则需要优化器在编译阶段给出分桶策略。对于均匀分布的数据,分桶策略较为简单。以tpch1T,lineitem表为例。l_orderkey的取值范围是1到60亿,且均匀分布。对该列进行shuffle的策略则是按照最小最大值进行平均分配,1-2亿分到桶1,2亿到4亿分到桶2,依次类推。对于非均匀分布的数据处理算法比较复杂,将在后文详细介绍。

MO在编译阶段由优化器决定使用range shuffle还是hash shuffle,通常优先使用range shuffle,如果出于某些原因无法使用range shuffle,则会使用hash shuffle,保证分桶的均匀性。

在MO Pipeline中对应shuffle算法的算子有两个,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值