Spark Shuffle(ShuffleManager发展、ShuffleMapStage & FinalStage、任务个数、Shuffle Writer、Shuffle Read)

ShuffleManager发展


Shuffle过程的执行、计算、处理的组件主要是ShuffleManager

第一代:在1.2以前使用的ShuffleManager,默认shuffle计算引擎是HashShuffleManager,而它有一个弊端,就是会产生很多的中间磁盘文件,产生大量的IO,严重影响了性能。

第二代:ShuffleManager弃用了HashShuffleManager,改成了SortShuffleManager后,产生了两种模式:普通模式和bypass机制;两种模式分别有不同的保存规律:排序、Hash

普通模式

一个task将所有数据写入内存过程中,可能会产生多次磁盘溢写操作,也就会产生多个临时文件。最终会把临时文件进行合并,并且还会单独写一份索引文件,所以每一个task会生成一个数据文件和一个索引文件

bypass机制

当数据量不大的情况下,可以使用Hash来实现有规律保存数据,所以当shuffle read task数量小于等于spark.shuffle.sort.bypassMergeThreshold(默认200)时,就会启用此机制。bypass机制会为每个下游task创建一个临时磁盘文件,并且将数据key进行hash,根据hash值将key写入磁盘文件。最终,对于每个task,同样会将所有的临时文件合并为一个磁盘文件,并创建一个单独的索引文件。该机制不对数据进行排序,所以也节省了这部分的性能开销。

在这里插入图片描述


ShuffleMapStage & FinalStage

在这里插入图片描述

  • ShuffleMapStage的结束(Map阶段结束),伴随着shuffle文件写磁盘。

  • FinalStage即最后一个stage,它是一个ResultStage。基本意味着action算子,即一个job运行结束。


Shuffle中任务个数

即map阶段,由若干个task来执行,当经过一系列的算子运算过后,如filter、split、reparititon或coalesce等,最终分区的个数为N,那么执行到shuffle操作时,map端的task个数和partition个数也将一致。

reduce端的stage默认取spark.default.parallelism配置项作为分区数,如果没有特别配置,则map端的最后一个RDD的分区数作为reduce端的个数。


Shuffle Writer & Shuffle Read

  • Shuffle Writer:当ShuffleMapStage、文件落盘,也相当于map阶段。它保证了数据的安全性,同时避免所有的数据都放在内存中,占用大量内存。

  • Shuffle Read:map过程会将文件写入磁盘,并且把位置信息会告诉Driver;reduce task启动前会向Driver获取磁盘文件的位置信息,然后去拉取数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值