目录
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- 上游不能进行提前聚合操作 (提前聚合意味着要进行分组操作, 而分组的前提是要对数据进行排序, 将相关的数据放置在一起).