说明:Spark是目前大数据中非常流行的运算框架,Spark的Shuffle机制是完成运算最重要的一环,面试时经常会被问到.
在Spark中,Shuffle分为map阶段和reduce阶段,也可称之为shuffle write和shuffle read阶段,Spark在1.1以前的版本一直是采用Hash Shuffle的实现的方式,到1.1版本时参考Hadoop MapReduce的实现开始引入Sort Shuffle,在1.5版本时开始Tungsten钨丝计划,引入UnSafe Shuffle优化内存及CPU的使用,在1.6中将Tungsten统一到Sort Shuffle中,实现自我感知选择最佳Shuffle方式,到最近的2.0版本, Hash Shuffle已被删除,所有Shuffle方式全部统一到Sort Shuffle一个实现中。这里我们只说明Sort Shuffle
Write 阶段会把 Mapper 中每个 MapTask 所有的输出数据排好序,然后写到一个 Data 文件中, 同时还会写一份 index 文件用于记录 Data 文件内部分区数据的元数据(即记录哪一段数据是输出给哪个 ReduceTask 的),所以 Mapper 中的每一个 MapTask 会产生两个文件 。
Read 阶段首先 Reducer 会找 Driver 去获取父 Stage 中每个 MapTask 输出的位置信息,跟据位置信息获取并解析 Index 文件,会根据 Index 文件记录的信息来获取所需要读取的 Data 文件中属于自己那一部分的数据。
*Mapper 端的排序分为两个部分:内部排序和分区排序,每个分区内部的数据是有序的,分区之间也是有序的,
如图Data 文件中有三个分区,分别着对应下游的 ReduceTask,分区排序的目的是让 ReduceTask
获取数据更加高效
*Sorted-Based Shuffle 过程 Mapper 端生成的文件个数与什么有关? 一个 core 即一个 Task 即一个分区即一个并发,一个 Task 会生成两个文件,Data 文件和 Index 文件。与 Reduce 端无关,Reduce 只负责读属于自己的那一部分数据。
*Sorted-Based Shuffle解决了Hash Shuffle在Mapper端做ShuffleWriter时所产生的大量文件问题,降低了资源消耗
*当前的Shuffle Write有三种 BypassMergeSortShuffleWriter, SortShuffleWriter 和UnsafeShuffleWriter.
触发Shuffle的一些操作
分类 | 操作 |
---|---|
repartition相关 | repartition,coalesce |
ByKey操作 | groupByKey,ReduceByKey,conbineByKey,aggregateByKey |
Join操作 | cogroup,join |
转载文章,侵权删