Spark之Shuffle机制和原理

Spark Shuffle简介

Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂

在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。Spark也会有自己的shuffle实现过程

HashShuffle

什么是HashShuffle?
每一个task的计算结果根据key的hashcode与reduce task的个数取模决定写入到哪一个分区文件,这样就能保证相同的数据一定是落入到某一个分区文件中。
在这里插入图片描述

shuffle可能面临的问题?

  • 小文件过多,耗时低效的IO操作
  • 内存溢出,读写文件以及缓存过多

磁盘小文件的个数 = map task num × reduce task num

磁盘小文件过多带来什么问题?

  • write阶段创建大量的写文件的对象
  • read阶段就要进行多次网络通信
  • read阶段创建大量的读文件的对象

优化后的HashShuffleManager
在这里插入图片描述
使用HashShuffle并且开启合并机制,shuffle过程中磁盘小文件个数为 cores × reduce task num

SortShuffle

该机制每一个MapTask不会为后续的任务创建单独的文件,而是会将所有的Task结果写入同一个文件,并且对应生成一个索引文件。以前的数据是放在内存缓存中,等到数据完了再刷到磁盘,现在为了减少内存的使用,在内存不够用的时候,可以将输出溢写到磁盘,结束的时候,再将这些不同的文件联合内存的数据一起进行归并,从而减少内存的使用量。

SortShuffle的运行机制主要分成两种:

  • 普通运行机制
  • bypass运行机制
SortShuffleManager普通运行机制

比较适合数据量很大的场景或者集群规模很大
在这里插入图片描述

SortShuffleManager bypass运行机制

主要用于处理Reducer任务数量比较少或不需要排序和聚合的Shuffle操作,数据是直接写入文件,数据量较大的时候,网络I/O和内存负担较重。
在这里插入图片描述
bypass运行机制的触发条件如下:
shuffle reduce task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值