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

大数据之Shuffle详解 阅读详情

作者:倪涛 

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算法的算子有两个,shuffle和dispatch。

Shuffle算子的功能是将输入的数据进行分桶,并且输出分桶后的数据。例如输入一个batch(MO是列存数据库,算子对数据的处理以batch为基本单位),batch内包含8192行数据,值为1、2、3 ... 一直到8192。如果需要分两个桶,可能的分桶结果是将1-4096放入一个新batch,4097-8192放入一个新batch内,然后将这两个新的batch再发送出去。

由于并发可能非常多,分桶后每个桶内数据可能很少,所以直接输出是不太合适的。因此shuffle算子需要在内部维护一个内存池,将分桶后的数据存放起来,攒到一定程度的时候再发送出去。或者是当shuffle算子读完所有输入数据后,就需要将内部所有数据都发送出去。

在pipeline里大部分算子都是一个batch输入对应一个batch的输出,但是shuffle算子并不会这样。由于内部维护的内存池,shuffle可能一段时间内没有输出,也可能连续输出多个batch。内存池的策略对shuffle算子的性能有比较重要的影响。

Dispatch算子负责将shuffle分桶后的数据发送到指定的位置。shuffle算子会在batch中设置一个字段shuffleIDX,dispatch算子读取这个字段,并且根据指定的策略找到需要发送的目的地并将batch发送出去。需要注意的是shuffleIDX这个字段不会参与batch的序列化和反序列化,因此shuffle算子和dispatch算子之间一定不能有跨CN的网络传输,否则会导致错误。

dispatch算子有三种发送数据的策略,绝大部分情况下使用第一种策略,后面两种策略在hybrid shuffle中使用,将在后续进行介绍。

  1. 直接根据shuffleIDX找到唯一的对应目的地(可能在本地CN,也可能在远端CN),并发送过去。可能会有跨CN的网络传输。
  2. 根据shuffleIDX找到当前CN的对应目的地,并发送过去。这种情况下一定只给本地发送一份,不会有跨CN的网络传输。
  3. 根据shuffleIDX找到每个CN的对应目的地,并发送过去。这种情况下会给每个CN都发送一份,必定会有跨CN的网络传输。

目前MO支持开启shuffle的算子有四个:load、scan、group和join。不过理论上任何算子对shuffle都是无感知的,以后MO将会支持对更多的算子开启shuffle算法。

Load算子

Load算子中部分复用了shuffle的分发逻辑来保证多并发读以及多并发写的情况下,写入s3的数据能保留数据原始排序。

Scan算子

对scan算子的shuffle,是在编译pipeline的阶段,将所有需要读的block分发到多个CN上。这里的shuffle是以block为单位进行,还没有到实际读取block数据的阶段。如果是hash shuffle,则对blockname做hash。如果是range shuffle,则取block zonemap里min max的中间值进行range计算。

Group算子

对group算子的shuffle,是将group算子在编译pipeline时静态展开成多个pipeline,对scan算子实际读取的block数据进行shuffle,理论上以每行数据为单位。每个pipeline接收shuffle输出的数据。此时group算子不需要merge group,每个单独的pipeline都可以直接输出数据到下一个pipeline。

Join算子

对join算子的shuffle,同样是将join算子在编译pipeline时静态展开成多个pipeline。join的输入分为probe和build两边,对两边的输入数据采用同样的shuffle算法,保证相同数据会分到同一个桶内。每个join算子也可以直接将join结果输出,而不需要做merge。

如果需要查看一条语句的执行计划是否开启shuffle,可以通过explain语句,查看执行计划中是否有shuffle关键字。例如tpch q4,可以看到lineitem表join orders表,join类型是right semi,lineitem是probe表,orders是build表。并且开启了shuffle join,在lineitem表上对l_orderkey这一列做了range shuffle。由于join两表采用同样的shuffle算法,所以在orders表上同样会对o_orderkey这一列做shuffle。

QUERY PLAN
Project
  ->  Sort
        Sort Key: orders.o_orderpriority INTERNAL
        ->  Aggregate
              Group Key: orders.o_orderpriority
              Aggregate Functions: starcount(1)
              ->  Join
                    Join Type: RIGHT SEMI   hashOnPK
                    Join Cond: (lineitem.l_orderkey = orders.o_orderkey) shuffle: range(lineitem.l_orderkey)
                    ->  Table Scan on tpch_10g.lineitem
                          Filter Cond: (lineitem.l_commitdate < lineitem.l_receiptdate)
                          Block Filter Cond: (lineitem.l_commitdate < lineitem.l_receiptdate)
                    ->  Table Scan on tpch_10g.orders
                          Filter Cond: (orders.o_orderdate >= 1997-07-01), (orders.o_orderdate < 1997-10-01)
                          Block Filter Cond: (orders.o_orderdate >= 1997-07-01), (orders.o_orderdate < 1997-10-01)

Part 3 Colocate shuffle

shuffle的执行计划在多CN上虽然可以减少hash表的开销,但是同样可能会导致数据在网络传输上传输的开销增加。一个好的shuffle执行计划,必须要尽可能减少数据在网络上的传输。所以接下来要介绍的colocate shuffle优化对性能是至关重要的。

仍以tpch1T,q4为例。lineitem表输出行数大约为38亿行,orders表输出行数大约为5千万行。如果采用broadcast join,hash表太大难以处理,并且需要广播5千万行的hash表,开销也不算低。如果采用普通的shuffle join,在3CN上,可以计算出需要走网络传输的数据量大约为(38亿+5千万)/3*2,大约是26亿行左右。虽然hash表变小了,但是网络传输开销太大,性能会降低到难以接受。此时使用colocate shuffle join是最优选择。

colocate shuffle join的具体原理是,从scan开始,利用block zonemap将数据分布到对应的CN上,并且尽可能保证后续的shuffle算法会将数据shuffle到当前CN上进行处理,最大程度减少数据跨网络发送。在这个例子中,优化器会告诉scan算子,block zonemap处于1-20亿之间的数据在CN1上读取,20亿-40亿之间的数据在CN2上读取,40亿到60亿之间的数据在CN3上读取。同时优化器会告诉shuffle join,1-20亿之间的数据需要shuffle到CN1上进行计算,20亿-40亿之间的数据shuffle到CN2上计算,40亿到60亿之间的数据在CN3上计算。如果每个CN有10核,那么具体到CN1是1-2亿之间在第一个pipeline上处理,2亿-4亿在第二个pipeline上处理,以此类推。具体到CN2是20亿-22亿之间在第一个pipeline上处理,22亿-24亿在第二个pipeline上处理,以此类推。具体到CN3是40亿-42亿之间在第一个pipeline上处理,42亿-44亿在第二个pipeline上处理,以此类推。

此时,只有极少数的block,由于数据正好跨越在shuffle的边界上,需要进行跨网络传输。例如某个block zonemap为19亿-21亿,这个block可能是在CN1上进行读取,读取到的8192行里一部分应该在CN1上计算,一部分应该发送到CN2进行计算。由于l_orderkey列是主键,TAE(MO的存储引擎)会保证主键在S3文件里的的排序,block与block之间应该是重叠非常少,需要跨网络传输的数据应该是极少数。整体流程示意如下图所示。

由此可见,想要开启colocate shuffle ,必须是range shuffle。如果使用hash shuffle,则一定无法开启colocate shuffle。

另外colocate shuffle 还有个优化是,对于绝大多数block,可以直接通过zonemap就判断出这个block可以整体shuffle到某个桶内,而不需要对每一行进行读取,计算,重新组成新的batch。在这种情况下,colocate shuffle join几乎没有引入新的开销,但是比broadcast join减少了广播hash表的开销,显著降低了hash表随机访问导致cache miss的开销。实测多CN场景下性能几乎是broadcast join的十倍以上。并且colocate shuffle join具有良好的多CN扩展性,可以达到线性扩展,甚至某些场景下可以超过线性扩展性。

Colocate shuffle在分布式场景下对性能提升很大,不过具体提升程度是与数据的排序性,block与block之间的重叠度有关的。通常主键或者clusterby列具有良好的排序性,提升最大,其他情况则colocate shuffle可能退化成普通shuffle。另外由于join是对两边做同样的shuffle策略,所以有可能是两边都开启colocate,也有可能只有一边可以开启colocate。由于join order的策略总是将小表放在build端,所以通常是优先对probe端的表开启colocate。

目前MO对colocate shuffle join的支持是优化器自动识别计算的。比起同类数据库的实现,优势在于不依赖手工收集统计信息,不需要修改DDL,对计算节点数量(CN数)以及并发数没有任何限制,扩缩容时也可以自动计算出新的shuffle执行计划,用户无需进行任何额外配置或调整,从而实现了完全透明的操作体验。主要体现在以下几个方面:

首先是统计信息,colocate shuffle join必须使用range shuffle,range shuffle又依赖优化器给出合理的shuffle策略,这就必须依赖准确的stats(统计信息)。而MO的优化器会在访问block zonemap时自动计算统计信息,不依赖任何定时或者人工更新统计信息的策略,可以保证在任何情况下都可以通过准确的stats来计算range shuffle策略。

其次不依赖分区表的分区策略。这里包含几个部分,一是可以支持对任意表进行colocate shuffle join,不需要用户改动任何DDL。二是不限制在特定的列上。例如lineitem join orders on l_orderkey = o_orderkey, 可能应该在l_orderkey 和 o_orderkey这两列上开启shuffle, 但是如果lineitem join part on l_partkey=p_partkey where l_shipdate < xxx, lineitem表过滤后输出行数小于part表输出,此时应该在lineitem表上做build,part表做probe,在p_partkey 列和l_partkey 列上做shuffle,保证part表的数据可以实现colocate。这个策略应当由优化器来进行计算,如果依赖用户指定,就可能无法得到最优执行计划。三是shuffle分桶数量不依赖分区的数量,有些情况下用户在建表时很难立刻给出最合适的分区数,还有些情况下,分区和分区之间的数据可能不是很均衡。MO的实现方式是用户无需感知这一切,全部交给优化器进行计算。

最后是对于serverless数据库,CN的数量随时会发生变化。第一次执行的时候可能是3CN10核的场景,需要shuffle分30个桶,下一次执行可能变成了5CN10核的场景,需要分50个桶。仍以tpch1T lineitem表为例,MO会自动计算出新的shuffle策略为第一个桶处理1-1.2亿,第二个桶处理1.2亿到2.4亿,依次类推。再下一次执行可能又变成了7CN8核,MO依旧会自动计算新的shuffle策略。

下篇预告

下篇将继续分享如何处理不均匀数据、hybrid shuffle、shuffle reuse、join reorder 等相关内容,感兴趣的同学可以加入MO 社区群持续关注

MatrixOne

MatrixOne 是一款基于云原生技术,可同时在公有云和私有云部署的多模数据库。该产品使用存算分离、读写分离、冷热分离的原创技术架构,能够在一套存储和计算系统下同时支持事务、分析、流、时序和向量等多种负载,并能够实时、按需的隔离或共享存储和计算资源。云原生数据库MatrixOne能够帮助用户大幅简化日益复杂的IT架构,提供极简、极灵活、高性价比和高性能的数据服务。

MatrixOne企业版和MatrixOne云服务自发布以来,已经在互联网、金融、能源、制造、教育、医疗等多个行业得到应用。得益于其独特的架构设计,用户可以降低多达70%的硬件和运维成本,增加3-5倍的开发效率,同时更加灵活的响应市场需求变化和更加高效的抓住创新机会。在相同硬件投入时,MatrixOne可获得数倍以上的性能提升

关键词:超融合数据库、多模数据库、云原生数据库、国产数据库。

吃透Chisel语言.04.Chisel基础(一)——信号类型和常量 开始肯定是介绍Chisel的基础内容了,《Chisel基础》这一部分主要会介绍数字设计中的两个基本组件:组合电路和触发器。这俩基本组件都不复杂,但是组合在一起就可以得到规模很大、功能也很强大的数字电路了。 第一部分我们就简单地看看Chisel中的信号类型和常量,在上一篇文章中也有相关介绍,其中还包括和Verilog之间的对比。...... 阅读详情

相关推荐

Python实战:5分钟搞定滑动平均窗口计算(附完整代码+逐行注释)

本文深入解析Python中滑动平均窗口计算的实现与优化,提供Numpy、Pandas等多种高效方案,并附完整代码和逐行注释。涵盖边界处理、性能优化及异常检测等实战技巧,帮助开发者快速掌握时间序列数据处理的核心技术。

weixin_30872157的博客 125

什么是shuffle?shuffle的原理及过程

首先,我们给 Shuffle 下了一个明确的定义,在分布式计算场景中,Shuffle 指的是集群范围内跨节点、跨进程的数据分发。我们在最开始提到,Shuffle 的计算会消耗所有类型的硬件资源。具体来说,Shuffle 中的哈希与排序操作会大量消耗 CPU,而 Shuffle Write 生成中间文件的过程,会消耗宝贵的内存资源与磁盘 I/O,最后,Shuffle Read 阶段的数据拉取会引入大量的网络 I/O。不难发现,Shuffle 是资源密集型计算,因此理解 Shuffle 对开发者来说至关重要。

星空的风fly 4万+

Sentaurus TCAD 实战指南:几何、掺杂与物理模型对Ion/Ioff的协同调控

本文详细介绍了Sentaurus TCAD在器件仿真中的实战应用,重点解析了Ion(开态电流)与Ioff(关态电流)的协同优化方法。通过几何结构设计、掺杂工程和物理模型选择三大要素的精细调整,实现器件性能的显著提升。文章结合28nm和7nm工艺案例,展示了如何平衡Ion与Ioff的矛盾关系,为TCAD工程师提供实用指导。

weixin_29159711的博客 136

OLAP数据库:hash、sort、shuffle、agg、join的实现原理

文章目录hash内存hashexternal hashsort内存sortexternal sortshufflehash shufflesort shuffleaggregatehash aggregatesort aggregate分布式aggregatejoinnested loop joinhash joinsort merge join分布式join总结 hash hash算法是指对于key计算出hash值,基于hash值识别相同key,从而进行归类、聚合等操作。 内存hash 类似于JAVA H

qq_41775852的博客 1953

基于Matlab的MIMO通信系统仿真_Simulink实现

瑞利衰落信道中使用空时分组码的BPSK调制的BER 1、2发1收 参数设置: 双极性信号元+1和-1,每符号含1bit; 采样时间=符号时间=1s; 采用基于数据帧的仿真计算模式,每帧中有2个采样值; 仿真时间=出现100个误码后停止仿真; 随机整数种子=22; Jakes衰落模型中每个信道上的多普勒频移=0.01Hz; 输人信号功率=2W; Alamouti码:两根发送天线,一根接收天线(分集阶= 2); 平均信道信噪比= 18dB; 仿真得出的误码率统计BER =0. 00017. 2、2发

太阳帅帅的博客 9688

交货单冲销发货过账的正确姿势:用 VL09 与 ABAP 批量反冲 Goods Issue

摘要 本文详细解析了SAP系统中VL09事务码的技术实现与业务应用。VL09用于反冲发货的货物移动,通过标准冲销路径(移动类型602冲销601)确保单据链路一致、状态机正确回退和业务规则生效。文章对比了经典VL09与Fiori应用在不同SAP产品形态中的位置,并针对STO场景提供了ME23N验证方法。核心内容包括WS_REVERSE_GOODS_ISSUE函数模块的调用要点、必须COMMIT的原因(SAP LUW机制),以及处理Handling Unit等限制条件的注意事项。最后给出了将VL09工程化的项目

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 595

青训营-大数据shuffle原理与实践

map任务的shuffle writer过程完成后,增加了一个额外的操作push-merge,将数据复制 份推到远程shuffle服务.上magnet shuffle service是一个强化版的ESS。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle 是支撑spark进行大规模复杂数据处理的基石。如果magnet上的block因为重复或者冲突等原因,没有正常完成merge的过程,则reduce task直接拉取未完成merge的block。

m0_73426012的博客 853

Python调用CANoe

我们可以创建CANoe应用程序对象,打开配置文件,启动模拟,发送和接收消息,并在完成后关闭CANoe应用程序。这使得我们能够使用Python自动化执行测试任务,并集成CANoe的功能到我们的Python应用程序中。CANoe是一款功能强大的汽车网络仿真和测试工具,它能够模拟和分析汽车网络通信,并提供丰富的测试功能。通过Python编程语言,我们可以方便地调用CANoe的API,实现自动化测试和集成CANoe的功能到我们的Python应用程序中。在CANoe中,我们可以为不同的汽车网络创建配置文件。

AzqLinux的博客 1288

Shuffle过程介绍

  摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都包含了一个重要的过程—Shuffle。本文对Shuffle过程进行解析,并对两个计算引擎的Shuffle过程进行比较。 腾讯分布式数据仓库(Tencent distributed Data Warehouse, 简称TDW)基于开源软件Hadoop和Hiv...

pengweid专栏 9515

DSI3接口介绍

DSI3(distributed system interface)分布式系统接口,是一种强大且通用的总线协议,旨在将多个遥感器和执行器互连到中央控制模块。在单总线中集成了电压信号、电流信号还有电源,甚至引用了3位状态机概念(反向数据),从逻辑0/1扩展到了0/1/2。

Airer_00的博客 4359

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1651

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

如果指标合适,说明可以给出合理的分桶方案,则会默认保留1024个桶的分布方法。对字符类型,由于每个字符占一个字节,但一个字节的大部分值不会出现在字符串中,对每个zonemap数据均匀分布的假设不成立,所以对每种出现过的字符映射到数字,重新计算每个字符串对应的新值后再按max从小到大排序。是一个0到1之间的float64类型变量,表示zonemap之间的重叠度,Overlap越大重叠的部分越多,具体定义为:任意两个zonemap之间重叠的比例的平均值的平方根,取平方根是为了更方便区分重叠度较低的部分数据集。

MatrixOrigin的博客 413

YOLOv11改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov11精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 1824

简化SQL计算之打乱数据列次序(Shuffle)

        REF_VALUES是数据库表,ID是主键,ORIGINAL_VALUE是源列,将ORIGINAL_VALUE打乱次序后要更新到空列SHUFFLED_VALUE。部分数据如下:           SQL:          不同的数据库写法不同,以Oracle为例: create or replace procedure shuffle as TYPE My_CurT...

一台数据分析的机器! 1990

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

大数据_Shuffle、MapReduce编程案例(数据去重、多表查询、倒排索引、使用单元测试)

一、什么是Shuffle(洗牌) ----> MapReduce核心 1、序列化 2、排序 3、分区 4、合并 二、MapReduce编程案例 ------> 掌握方法:如何开发一个程序 1、数据去重: 复习:SQL:distinct去掉重复的数据 作用于后面所有的列 复习(

Casablanca 947

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

从数据库的聚合到shuffle

前言:数据库怎么实现聚合?看过《数据库系统实现》第四章的话,知道有基于散列和基于排序的2种方式,散列理解成hash即可,散列和排序很容易联想到mr的shuffle和spark的shuffle,所以本篇只是很肤浅的 ...

zhaolq1024的博客 671

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MapReduce:详解Shuffle过程

[size=medium] /** * author : 冶秀刚 * mail : dennyy99@gmail.com */ Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混。前段时间...

每天一小步 1847

打乱mysql数据顺序_打乱数据库表内的数据顺序

【问题】What is a best way to shuffle a database column using pl/sql. how to shuffle a database column eg first name with around 70000 of rows . TIA针对此问题,有人给了下面的方案:DECLARESUBTYPE Name IS VARCHAR2(200);TYP...

weixin_35757531的博客 2566

shuffle简介

一、shuffle概述。 hadoop中mapper之后,reducer之前的阶段称之为shuffle,是mapreduce的核心。我们不用知道它的定义,只需要知道它的功能,以及它的优化。 为什么会有shuffle? hadoop中,map负责数据的初级拆分获取解析,reduce负责最终数据的集总,除了业务逻辑的功能外,其他的核心数据处理都是由shuffle来支持。 ​ shuffle中有什么 简单来说,shuffle中有三次的数据排序 第一次是快速排序,这是因为第一...

weixin_45216482的博客 4163

大数据-Shuffle工作机制

Shuffle工作机制 Shuffle过程:数据从MapTask拷贝到ReduceTask的过程 Shuffle基本要求: (1)完整地将数据从MapTask端拷贝到ReduceTask端 (2)在拷贝过程中,应尽量减少网络资源的消耗 (3) 尽可能地减少磁盘IO对Task执行效率的影响 (1) ...

Destiny的博客 929

Hive Shuffle 的具体过程

Shuffle 是指在 MapReduce 作业中,将数据从 Mapper 中传输到 Reducer 的过程。这个过程通常涉及到数据的重新分配和排序,以确保相同的键被发送到同一个 Reducer 节点。Shuffle 是大数据处理中的关键环节,因为它直接影响到作业的性能和结果的正确性。Join 操作:将两个或多个表的数据进行合并。Group By 操作:将数据分组成多个组并进行聚合计算。Aggregation 操作:对数据进行汇总,例如求和、计数等。

My_wife_QBL的博客 1756

Spark-SQL中的shuffle详解

本文系统介绍了Apache Spark中的Shuffle机制及其在RDD和SQL体系中的应用。Shuffle是Spark实现数据重分布的关键过程,用于groupByKey、reduceByKey等操作。文章详细分析了宽窄依赖的分类标准,阐述了Shuffle在物理执行计划中的实现原理,包括Exchange阶段边界和ShuffleExchangeExec的核心流程。同时深入比较了HashShuffle、SortShuffle等不同实现策略的优缺点,并探讨了Shuffle与SQL物理执行的复用关系,包括排序合并连

qq_37527921的博客 1298

深入解析大数据Shuffle机制:从原理到实践

本文深入解析大数据处理中的核心Shuffle机制,从原理到实践全面剖析。文章阐述了Shuffle作为大规模数据重组的关键过程,如何通过Shuffle Write和Shuffle Read两阶段实现分布式计算中的数据分组与聚合,并探讨了Spark Shuffle的演进、核心数据结构及实战调优策略,帮助开发者优化性能、避免常见陷阱。

weixin_29094979的博客 409

shuffle原理 及优化策略

1、shuffle操作原理: 在Spark中,数据通常不会跨分区分布,以满足特定操作的需要。在计算期间,单 个任务将对单个分区进行操作——因此,要组织单个reduceByKey 的计算任务要执行 的所有数据,Spark需要执行一个all-to-all操作。它必须从所有分区中读取所有 键的所有值,然后将所有分区的值放在一起计算每个键的最终结果——这称为shuffle。 Spark中的某些操作会触...

python -学习笔记 2030

mysql 数组处理函数_比较常用的一些数组操作函数 mysql函数

array_product($v); //计算数组中所有值的乘积array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值array_unique移除数组中重复的值array_rand:从数组中随机取出指定长度的个数的元素下标(数字或字符串)shuffle:将原来的数组里的元素打乱array_merge():先保留第一个数组的所有元素,如果后面数组的元素与前面数...

weixin_32236671的博客 1914

浅谈Hadoop中的shuffle机制

浅谈Hadoop中的shuffle机制、解析源码各个类和方法的作用以及优化策略

m0_52931616的博客 1266
上一篇: 迁移篇 | MatrixOne与MySQL全面对比
下一篇: MO干货 | shuffle执行计划解析(下篇)
MatrixOrigin
博客等级 码龄5年 708粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值