Spark SortShuffleManager 运行原理

SortShuffleManager运行原理

SortShuffleManager的运行机制主要分成两种,一种是普通运行机制,另一种是bypass运行机制。当shuffle read task的数量小于等于spark.shuffle.sort.bypassMergeThreshold参数的值时(默认为200),就会启用bypass机制。

普通运行机制

在这里插入图片描述

  • 会把shuffle的数据先写内存[数据结构] 这里会有一个批次,至于内存数据结构是什么类型的下面有解释
  • 达到临界阈值会先对内存数据结构中已有的数据进行排序
  • flush disk分批将数据写入磁盘文件(默认的batch数量是10000条),排序好的数据,会以每批1万条数据的形式分批写入磁盘文件,这是通过Java的BufferedOutputStream实现的。BufferedOutputStream是Java的缓冲输出流,首先会将数据缓冲在内存中,当内存缓冲满溢之后再一次写入磁盘文件中,这样可以减少磁盘IO次数,提升性能。
  • files (那么这种写中间的files也是非常多的),一个task将所有数据写入内存数据结构的过程中,会发生多次磁盘溢写操作,也就会产生多个临时文件
  • files分为 disk + memory
  • merge(将所有磁盘的文件读进来和内存的一起写成一个完整的)
  • 一个task 生成一个文件 + index(这时候同Map、Reduce个数已经没有多大关系了,加index是因为如果你排序是排好的,但是很可能是交给下游的task来用的,那么就要知道从哪里去取,就类似Kafka中的offset),由于一个task就只对应一个磁盘文件,也就意味着该task为下游stage的task准备的数据都在这一个文件中,因此还会单独写一份索引文件,其中标识了下游各个task的数据在文件中的start offset与end offset。

PS:有shuffle算子reducebykey group…不同算子采用的数据类型结构肯定是不一样的,所以上面写到内存会有一个[数据结构]

数据结构

  • PartitionedAppendOnlyMap reducebykey走的肯定是这个Map数据结构,一边通过Map进行聚合,一边写入内存
  • PartitionedPairBuffer 对于其他算子走的就是Array数据结构,直接写入内存

总结

SortShuffleManager由于有一个磁盘文件merge的过程,因此大大减少了文件数量。比如第一个stage有50个task,总共有10个Executor,每个Executor执行5个task,而第二个stage有100个task。由于每个task最终只有一个磁盘文件,因此此时每个Executor上只有5个磁盘文件,所有Executor只有50个磁盘文件。

bypass运行机制

在这里插入图片描述
先看官网一个参数:

spark.shuffle.sort.bypassMergeThreshold
	200	  //该参数默认是200
	
(Advanced) In the sort-based shuffle manager, avoid merge-sorting data if there is no map-side aggregation and there are at most this many reduce partitions.

//说明这里没有Map端的聚合,reduceByKey就不适用

场景

  • shuffle read partitions/tasks < 200
  • no map-side aggregation (reduceByKey就不行,是做局部聚合的)

原理

  • 类似于hashshufflemanager + merge ,此时task会为每个下游task都创建一个临时磁盘文件,并将数据按key进行hash然后根据key的hash值,将key写入对应的磁盘文件之中,当然,写入磁盘文件时也是先写入内存缓冲,缓冲写满之后再溢写到磁盘文件的。
  • file + index,最后,同样会将所有临时磁盘文件都合并成一个磁盘文件,并创建一个单独的索引文件

总结

该过程的磁盘写机制其实跟未经优化的HashShuffleManager是一模一样的,因为都要创建数量惊人的磁盘文件,只是在最后会做一个磁盘文件的合并而已。因此少量的最终磁盘文件,也让该机制相对未经优化的HashShuffleManager来说,shuffle read的性能会更好。

比较

第二种bypass运行机制与普通SortShuffleManager运行机制的不同在于:

  • 第一,磁盘写机制不同;
  • 第二,不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值