spark shuffle特点和导致shuffle的算子

本文介绍了Spark Shuffle的两个主要特点:内存缓存策略避免内存溢出和不强制排序带来的效率提升。此外,列举了三种常见的触发Shuffle的算子:repartition类、byKey类和join类,并解释了它们为何需要Shuffle。

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

Spark Shuffle操作的两个特点

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

1、repartition类的操作:比如repartition、repartitionAndSortWithinPartitions、coalesce等

### Spark 中产生 Shuffle算子及其使用场景 #### 1. **repartition** `repartition` 是一种转换算子,其主要功能是调整 RDD 的分区数量。通过重新分配数据到新的分区中,该算子会触发一次全局的 shuffle 操作[^1]。 - **语法**: `def repartition(self, numPartitions) -> RDD[T]` - **使用场景**: 当需要增加或减少分区数时,通常用于优化计算性能或满足下游处理需求。 #### 2. **sortBy** `sortBy` 算子会对 RDD 中的所有元素进行整体排序,并允许指定自定义的排序规则以及升序/降序选项。由于涉及全量数据的排序操作,因此不可避免地会产生 shuffle[^3]。 - **语法**: `def sortBy(self, keyFunc: (T) -> K, ascending: bool = True, numPartitions: int = None)` - **参数说明**: - `keyFunc`: 定义如何提取键值以决定排序依据。 - `ascending`: 是否按升序排列,默认为 `True`。 - `numPartitions`: 排序后的分区数目。 - **使用场景**: 需要对大规模非 Key-Value 类型的数据集执行全面排序的任务。 #### 3. **reduceByKey groupByKey** 这些算子属于宽依赖操作,在处理过程中需要将具有相同键的记录聚集在一起,从而引发 shuffle 行为。 - **reduceByKey**: 对每组共享同一键的值应用聚合逻辑。 - **groupByKey**: 将拥有相同键的所有值收集至单个列表中返回。 - **使用场景**: 数据分组统计分析、汇总运算等场合下广泛采用。 #### 4. **join 及其他关联类算子** 当两个分布式数据集之间存在连接关系时(如 inner join、left outer join),为了匹配对应的键值组合,必然会发生跨节点间的数据交换即 shuffle 过程。 - **典型例子**: ```python rdd1.join(rdd2) ``` - **适用范围**: 处理多源异构数据融合问题时常被调用。 以上列举了几种常见的会引起 shuffle 效应的操作符连同它们各自的应用环境描述。值得注意的是,尽管 shuffle 能够提供强大的灵活性支持复杂查询模式,但它同时也可能成为系统瓶颈所在之处,因为涉及到大量的磁盘 I/O 网络传输开销。 ```python # 示例代码展示 reduceByKey 使用方法 rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)]) result = rdd.reduceByKey(lambda x, y: x + y).collect() print(result) # 输出 [('a', 2), ('b', 1)] ``` 问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值