自学背景知识:Spark基本工作原理Job、Task、Stage、MapReduce
lv0
Shuffle(洗牌)是介于MapReduce框架的中间阶段,Map负责实现其写入,Reduce实现其读取。大致过程就是将Map在内存中的缓存进行分区、排序、溢出到磁盘的数据进行抓取合并以重新持久化到磁盘与内存中,便于执行Reduce任务。(后接lv1-1)
其任务执行过程是在Stage阶段判断是否是宽依赖,存在宽依赖才会进行Shuffle。(后接lv1-2)
而对于带有宽依赖的RDD执行compute时会读取上一个Stage输出的Shuffle数据。(后接lv1-3)
lv1-1
过去Spark用的是基于Hash的,所带来的问题就是中间文件过多比较低效,中间文件数量与MapTask,ReduceTask的Core数正相关。目前Spark是基于sort。即将Mapper阶段的Task全部写到一个Data文件中,同时生成一个索引文件。Reduce阶段的每一个Task根据索引读取数据。从而降低随机磁盘I/O与内存开销。后续又引入了外部排序机制,即将数据放入内存改为记录级写入,以及动态资源分配等等。
Spark存在过HashBasedShuffle(已不用)、SortedBasedShuffle(默认)、TungstenSortedBasedShuffle(已并入前者由系统自动识别是否需要启用)三种方式。(后接lv2-1)
lv1-2
判断宽依赖是否存在,是基于存在ShuffleDependency宽依赖。届时会将Job划分成多个S