Spark Shuffle机制

Shuffle机制

所谓shuffle就是把不同节点上的数据按相同key值拉取到一个节点上,在这过程中会涉及到IO,所以执行速度会受到影响.

shuffle发生在map 和reduce之前(也可以说是两个stage之间)分为shuffleWrite 和shuffleRead两个过程
shuffle 过程:
前一个stage进行shuffle write 把数据存在blockManage,
下一个stage 进行shuffle read 拉取上个stage 的数据

spark1.2之前默认是hashShuffle ,1.2之后默认为sortShuffle

未优化的HashShuffle
  • shuffle write
    前一个shuffle结束,会为下一个shuffles生成所需文件.首先根据key进行hash分类,把相同的key写入一个文件,在写入文件之前先写入缓存,缓存满了再溢出到磁盘
    计算当前stage会生成多少文件:
    比如下一个stage有100个task,那么当前每个task会生成100个文件,若当前有50个task,10个Executors,每个Executor处理5个task,那么总共产生5×10×100=5000个文件

  • shuffle read
    shuffle read 就是下一个stage的每个task会去上一个stage不同节点产生文件里拉取属于自己key的数据.到当前节点.shuffle ,然后进行聚合或join操作.其实它是它是边拉取执行操作,每个read task有一个buffer,每个拉取buffer大小的数据,放大缓存进行聚合,直到数据拉取完.

优化的HashShuffle

通过设置参数 spark.shuffle.consolidateFiles=true,默认是false
开启这个机制后,在shuffle write 阶段,上一个stage只有第一个task会为下一个stage的每个task创建一个文件,从第二个task开始,都会复用第一个task产生的文件,.现在产生100个task ,10个Executors,处理50个task,在每个Executor处理5个task,每个Executor只需创建100个文件(之前需要创建500个),总共创建10×100=1000个文件,减少4000个文件

sort shuffle

spark 1.2之后出现了sort shuffle.
上一个stage的map输出会按照patition Id 和key对记录进行排序,同时将全部结果输出到一个文件里.同时生成一个索引文件.
步奏:

  1. 先把数据写入Map或者buffer,在内存中排序(排序根据patition id 和 key)
  2. 如果超过内存,就spill到文件中,文件中的元素也是有序的,
  3. 如果需要要输出全局有序的文件,就把之前输出的文件和当前内存中的数据进行全局排序.
  4. 这样第一个stage50个task,由于每个task最终只有一个磁盘文件,因此此时每个Executor上只有5个磁盘文件,所有Executor只有50个磁盘文件
BypassMergeSortShuffleWriter

和hashShuffle实现机制差不多,唯一区别就是map端多个输出文件会汇总为一个文件.所有分区合并成一个文件,同时生成一个索引文件,可以索引到每个分区的地址.
因为Bypass会临时输出reducer(patition个数)个小文件,所以分区数必须要小于一个阈值,默认200

UnsafeShuffleWriter

需要Serializer支持relocation,Serializer支持relocation:原始数据首先被序列化处理,并且再也不需要反序列,在其对应的元数据被排序后,需要Serializer支持relocation,在指定位置读取对应数据。
注意

  1. 这种方式不宜有太多分区,因为过程中会并发打开所有分区对应的临时文件,会对文件系统造成很大的压力
  2. spark 2.0移除了Hash-based shuffle manager
    bypass,sort,unsafe三种shuffle机制选择
    在这里插入图片描述
    参考:
    https://www.cnblogs.com/itboys/p/9201750.html
    https://www.cnblogs.com/arachis/p/Spark_Shuffle.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值