Spark Shuffle机制详解

目录

spark技术笔记

Shuffle的发展史

HashShuffle机制

优化前的HashShuffle机制

优化前的HashShuffle机制的弊端

优化后的HashShuffle机制

SortShuffle机制

SortShuffle机制 普通运行方式

SortShuffle的ByPass模式


spark技术笔记

Shuffle的发展史

1. Spark1.1版以前, 用的是:HashShuffle机制(具体分为 优化前, 优化后)

2. Spark1.1版及其以后, 新增了: SortShuffle机制.

3. Spark1.5版及其以后, 加入了: 钨丝计划.

4. Spark1.6版及其以后, 将钨丝计划合并到了SortShuffle中, 加入了合并排序等功能.

5. Spark2.0版及其以后, 将HashShuffle的方案合并到了SortShuffle中, 且移除了HashShuffle机制.

HashShuffle机制

优化前的HashShuffle机制

1. 每一个父RDD的每个线程, 都会生成和子RDD分区数一样的 文件个数.

2. 父RDD执行完毕后, 子RDD需要去父RDD的每个线程中拉取属于自己的数据.

优化前的HashShuffle机制的弊端

1. 父RDD生成的文件数过多, 会导致HDFS上小文件过多, 降低效率.

2. 子RDD需要从父RDD中读取多次,会涉及到多次的IO, 文件的打开关闭, 较消耗资源.

3. 假设父RDD中有100个分区(线程), 且子RDD中也有100个分区, 则生成的文件数为:

        100(父RDD线程数)  * 100(子RDD线程数) = 10000个文件. 

优化后的HashShuffle机制

优化后的HashShuffle机制:

1. 由Executor进程来维护管理(相当于小组组长), 每个父RDD会生成和子RDD数量一样的文件.

        将N个线程N个分区生成N*N个文件(小组成员), 改为: 每个Executor(小组组长)维护1份.

2.   降低子RDD从父RDD分区中,拉取数据的次数, 减少IO.

3. 假设有父RDD有100个分区, 子RDD也有100个分区, 则生成文件综述为:

        1(每个Executor进程维护1份) * 100(子RDD分区数)  = 100个文件

SortShuffle机制

SortShuffle机制 普通运行方式

1. 父RDD的每个线程将数据分区处理后, 结果写到:内存缓冲区中(5M)

2. 缓冲区达到一定的阈值后, 会触发溢写线程, 将数据写到磁盘上, 获取磁盘小文件.

        分批次写出(阈值:  10000条), 写出到磁盘之前会先进行排序.

3. 当父RDD 线程执行结束后, 会对所有的磁盘文件做合并, 获取: 磁盘最终文件.

4. 为了方便子RDD拉取数据, 与磁盘最终文件对应的还有1个索引文件, 记录: 数据(分区)信息.

5. 子RDD的线程, 结合索引文件, 从磁盘最终文件中拉取属于自己的数据.

SortShuffle的ByPass模式

【在普通机制的基础上,省略了排序的过程】

**使用ByPass前提条件**:

    1- 上游的分区的数量不能超过200(默认)个.
    2- 上游不能进行提前聚合操作 (提前聚合意味着要进行分组操作, 而分组的前提是要对数据进行排序, 将相关的数据放置在一起).

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值