MapReduce的Shuffle和Spark的Shuffle过程对比

MapReduce的Shuffle过程涉及内存缓冲区溢写、排序和合并,而Spark的Shuffle则采用类似MapReduce的机制,包括Hash和Sort两种方式,优化了文件数量和内存使用。Spark的Sort Shuffle在内存不足时将数据溢写到磁盘,通过外部排序减少内存压力,同时提供了BypassMergeSort和UnsafeShuffleWriter等不同策略。
摘要由CSDN通过智能技术生成

MapReduce的Shuffle和Spark的Shuffle过程对比

MapReduce的Shuffle

MapReduce计算模型分为map和reduce两个重要阶段,map是映射,负责数据的过滤分发。reduce是规约,负责数据的计算归并,map将数据传递给reduce,reduce需要通过shuffle来读取数据。map输出到reduce的输入广义的称之为Shuffle。Shuffle横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和sort过程。

Map端

对于map端,每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区达到一定阀值的时候要将缓冲区的数据以临时文件的方式落地到硬盘中,当整个map task 结束后在对磁盘中这个task产生的临时文件在合并,生成最终的输出文件,然后等待reduce task来拉取文件。

  • 整个内存缓冲区就是在内存中构造的一个环形数据结构中。使用环形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据。这个数据结构其实就是个字节数组,叫Kvbuffer,里面存放了数据和一些索引数据,索引数据的区域叫做Kvmeta,数据和索引在Kvbuffer中是相邻不重叠的两个区域。
  • 这个环状缓冲区大小是有限制的,默认100M。当map的task输出很多时就会溢出,所以要在一定程度下把数据实例到硬盘上。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。负责溢写工作的是一个单独的线程,不能影响到map task向缓存区写入数据,缓存区数据量达到什么时候开始Spill是要考虑下的,例如如果缓存区写满数据时在进行Spill,那么map 就需要缓存区空出空间后才可以继续写。所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8。当数据量达到80%时启动这个线程,执行溢写工作。map task还可以向剩下的20%空间写入数据。
  • 当Spill线程启动后,要对这80%的数据的key进行排序。排序是MapReduce的默认行为,也是对序列化的字节进行排序,排序算法:字典排序
  • 对溢写的一个细节:如果有多个Key Value这样的数据要发送到Reduce端,需要将这些Key Value 值拼接到一块,减少partition相关的索引数量。例如对于简单的WordCount程序我们map端产生的数据是a:1, a:1这样的数据,则需要将相同的key合并起来,会将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。这个过程也叫做combine。如果client设置过Combiner,其会将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。需要注意的一点是,这里的合并并不能保证所有map结果的key都合并了,这里的合并范围只是针对一次溢写文件的所有键值的key不同。
  • 每次溢写都会产生溢写文件,每一次Spill过程就会最少生成一个out文件,有时还会生成index文件,Spill的次数也烙印在文件名中。如果map的结果很大会产生多次溢写操作所以会产生很多的溢写文件。当map task真正完成时会产生至少一个溢写文件。但是最终产出的文件只有一个所有会产生一次Merge动作,例如对于WordCount一个map task 产出的结果是 a:5另一个map task产出的结果是a:10所以需要Merge成Group,结果就是a:[5,10,…],然后将这些结果相加。注意:combiner的合理设置可以提高效率,但是如果使用不当会影响效率!

至此map端的工作已经全部结束,最终生成的文件也会存储在TaskTracker能够访问的位置。每个Reduce task不间断的通过RPC从JobTracker那里获取Map Task是否完成的信息,如果得到的信息是map task已经完成,那么Shuffle的后半段开始启动。

Reduce端

当mapreduce任务提交后,reduce task就不断通过RPC从JobTracker那里获取map task是否完成的信息,如果获知某台TaskTracker上的map task执行完成ÿ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值