优化后的shuffle操作的原理剖析(二)


首选我们有上图这样一个job计算,对上图通过DAGScheduler的stage划分之后,我们产生了如下图所示的stage图

在这当中我们可以清楚的看到,前一个stage的shufflemaptask进行shuffle的wirte 操作,把数据存储在了blockmanager上面,并且把数据的元信息上报到driver的mapouttrack组件中,下一个stage根据数据位置元信息,进行shuffle read,拉取上一个stage的输出数据。
1、首先我们说下spark shuffle的演进历史
 

  • Spark 0.8及以前 Hash Based Shuffle

  • Spark 0.8.1 为Hash Based Shuffle引入File Consolidation机制

  • Spark 0.9 引入ExternalAppendOnlyMap

  • Spark 1.1 引入Sort Based Shuffle,但默认仍为Hash Based Shuffle

  • Spark 1.2 默认的Shuffle方式改为Sort Based Shuffle

  • Spark 1.4 引入Tungsten-Sort Based Shuffle

  • Spark 1.6 Tungsten-sort并入Sort Based Shuffle

  • Spark 2.0 Hash Based Shuffle退出历史舞台
    总结一下,就是最开始的时候是Hash based shuffle,这时候就是最原始的shuffle操作(如果不明白可以看下我的另外一篇博客:https://blog.csdn.net/yrsg666/article/details/100095829),mapper会产生reducer的数量的bucket,以及对应bucket缓存的shuffleBlockFile磁盘文件。文件数量就是 shufflemaptask数量*resulttask数量对应到hadoop中就是M*R的数量,这样会产生大量的小文件,IO要求很高,很容易OOM,其次就是各种版本的优化了,首先是在0.8.1引入了consolidation机制,如果不明白请参考:https://blog.csdn.net/yrsg666/article/details/100096907,再之后还有 Tungsten-Sort Based Shuffle, 这个是直接使用堆外内存和新的内存管理模型,节省了内存空间和大量的gc, 是为了提升性能。现在用2.2观察了下其更新声明,粗略浏览了一下在shuffle上没看到比2.1明显的变化,找到一篇很不错的博客,在此借用下大牛的博客,在此进行下个人的理解梳理。
    2.1 分为三种writer, 分为 BypassMergeSortShuffleWriter, SortShuffleWriter 和 UnsafeShuffleWriter

    上面是使用哪种writer的判断依据,是否开启mapsidecombine这个判断,是因为有些算子在map端会先进行一次combin,比如reducebykey,减少数据的传输。BypassMergeSortShuffleWriter会临时输出reduer个(分区数据)小文件,所以分区数必须要小于一个阀值,默认是200。UnsafeShuffleWriter需要Serializer支持relocation,Serializer支持relocation:原始数据首先被序列化处理,并且再也不需要反序列化,在其对应的元数据被排序后,需要Serializer支持relocation,在指定位置读取对应数据。
    BypassMergeSortShuffleWriter 实现细节
    BypassMergeSortShuffleWriter和Hash Shuffle中的HashShuffleWriter实现基本一致,唯一的区别在于,map端的多个输出文件会被汇总为一个文件,所有分区的数据会合并为同一个文件,会生成一个索引文件,是为了索引到每个分区的起始地址,可以随机access某个partition的所有数据。如下图:

但是需要注意,这种方式不宜有太多分区,因为过程中会并发打开所有的分区对应的临时文件,会对文件系统造成很大的压力。具体实现就是给每个分区分配一个临时文件,对每个record的key使用分区器(模式是hash,如果用户自定义就是用自定义的分区器)找到对应分区的输出文件句柄,直接写入文件,没有在内存中使用buffer。最后copyStream方法把所有的临时分区文件拷贝到最终的输出文件中,并且记录每个分区的文件其实写入位置,把这些位置数据写入索引文件中。
SortShuffleWriter 实现细节
我们可以……
参考博客:
https://www.cnblogs.com/itboys/p/9201750.html
https://blog.csdn.net/u011564172/article/details/71170234

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值