简单搞定spark的shuffle流程

本文详细介绍了Spark中触发shuffle的操作,如reduceByKey等,并深入分析了shuffle的原理及优化措施。包括如何避免内存溢出,以及与MapReduce相比,Spark在数据处理速度上的优势。

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

Shuffle原理剖析与源码分析

1、在Spark中,什么情况下,会发生shuffle?reduceByKey、groupByKey、sortByKey、countByKey、join、cogroup等操作。
2、默认的Shuffle操作的原理剖析
3、优化后的Shuffle操作的原理剖析
4、Shuffle相关源码分析
普通的shuffle:
优化后的shuffle:


spark shuffle操作的两个特点

第一个特点,
    在Spark早期版本中,那个bucket缓存是非常非常重要的,因为需要将一个ShuffleMapTask所有的数据都写入内存缓存之后,才会刷新到磁盘。但是这就有一个问题,如果map side数据过多,那么很容易造成内存溢出。所以spark在新版本中,优化了,默认那个内存缓存是100kb,然后呢,写入一点数据达到了刷新到磁盘的阈值之后,就会将数据一点一点地刷新到磁盘。
    这种操作的优点,是不容易发生内存溢出。缺点在于,如果内存缓存过小的话,那么可能发生过多的磁盘写io操作。所以,这里的内存缓存大小,是可以根据实际的业务情况进行优化的。

第二个特点,
    与MapReduce完全不一样的是,MapReduce它必须将所有的数据都写入本地磁盘文件以后,才能启动reduce操作,来拉取数据。为什么?因为mapreduce要实现默认的根据key的排序!所以要排序,肯定得写完所有数据,才能排序,然后reduce来拉取。
    但是Spark不需要,spark默认情况下,是不会对数据进行排序的。因此ShuffleMapTask每写入一点数据,ResultTask就可以拉取一点数据,然后在本地执行我们定义的聚合函数和算子,进行计算。
    spark这种机制的好处在于,速度比mapreduce快多了。但是也有一个问题,mapreduce提供的reduce,是可以处理每个key对应的value上的,很方便。但是spark中,由于这种实时拉取的机制,因此提供不了,直接处理key对应的values的算子,只能通过groupByKey,先shuffle,有一个MapPartitionsRDD,然后用map算子,来处理每个key对应的values。就没有mapreduce的计算模型那么方便。


### Spark Shuffle 执行流程详解 #### 任务划分与Stage分割 Spark应用程序运行过程中,DAGScheduler会将计算逻辑切分成不同的阶段(Stages),每个阶段内部的任务可以并行执行。当存在宽依赖时,则需要通过Shuffle操作来处理不同分区之间的数据交换[^1]。 #### Shuffle Write过程 对于每一个Map端Task而言,在完成自身的计算之后并不会直接把结果返回给Reducer而是先将其写入本地磁盘文件中形成临时文件。此期间涉及到如何高效地写出这些中间件产物而不必对其进行全局排序等问题已经被深入探讨过[^2]。 #### 注册Shuffle元数据 在整个集群范围内唯一标识一次特定的Shuffle操作是非常重要的。因此,在Driver节点上设有专门用于管理此类信息的对象——`ShuffleManager`。它提供了方法用来记录关于当前正在进行之Shuffle的相关属性,例如ID编号、参与映射转换的地图数目等细节参数[^3]。 ```python def register_shuffle(shuffle_id: int, num_maps: int, dependency): """ Registers metadata about a shuffle operation. Args: shuffle_id (int): Unique identifier for the shuffle. num_maps (int): Number of map tasks involved in this shuffle. dependency : Dependency information between parent and child RDDs. Returns: A handle that can be used to refer back to registered shuffle data. """ pass # Placeholder implementation ``` #### Executor上的Shuffle Manager职责 除了上述提到的功能外,位于各个工作节点内的Executors同样配备有自己的`ShuffleManager`实例。它们的主要责任在于实际执行具体的I/O操作以保存来自上游算子产生的部分聚合后的键值对集合到持久化存储介质上去;同时也承担着后续拉取其他机器所持有的对应分片的能力[^4]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值