大数据开发:剖析Hadoop和Spark的Shuffle过程差异

  • 时间:
  • 浏览:1

Reduce任务通过向各个Map任务拉取对应分片。你这一过程就有以Http协议完成,每个Map节点就有启动另三个 多常驻的HTTP server服务,Reduce节点会请求你这一Http Server拉取数据,你这一过程删改通过网络传输,太大太大太大太大有是另三个 多非常重量级的操作。

1、Hadoop的另三个 多多Map完成,Reduce便还能够 去fetch数据了,何必 等到所有Map任务完成,而Spark的都要等到父stage完成,也有然后父stage的map操作删改完成能够去fetch数据。

3、Hadoop的Reduce要等到fetch删改部数据,才将数据传入reduce函数进行聚合,而spark是一边fetch一边聚合。

Map端做了下图所示的操作:

4、ShuffleMapTask 怎么可以决定数据被写到哪个缓冲区呢?你这一有然后跟partition算法有关系,你这一分区算法还能够 是hash的,也还能够 是range的

四、总结

Reduce端,拉取到各个Map节点对应分片的数据我你可不可以,会进行再次排序,排序完成,结果丢给Reduce函数进行计算。

Shuffle描述的是数据从Map端到Reduce端的过程,大数据学习kou群74零零加【41三八yi】大致分为排序(sort)、溢写(spill)、合并(merge)、拉取拷贝(Copy)、合并排序(merge sort)这2个过程,大体流程如下:

shuffle write的避免逻辑会倒进该ShuffleMapStage的最后(有然后spark以shuffle趋于稳定是是否是来划分stage,也有然后宽依赖),final RDD的每一根绳子 记录就有写到对应的分区缓存区bucket,如下图所示:

总体过程如下图的红框处:

一、前言

那么Shuffle Read发送的时机是哪些?是要等所有ShuffleMapTask执行完,再去fetch数据吗?理论上,若果另三个 多多 ShuffleMapTask执行完,就还能够 开使fetch数据了,实际上,spark都要等到父stage执行完,能够执行子stage,太大太大太大太大有,都要等到所有 ShuffleMapTask执行完毕,才去fetch数据。fetch过来的数据,先存入另三个 多Buffer缓冲区,太大太大太大太大有这里一次性fetch的FileSegment还能够 太大,当然有然后fetch过来的数据大于每另三个 多阀值,也是会spill到磁盘的。

Spark shuffle相对来说更简单,有然后何必 求全局有序,太大太大太大太大有那么太大排序合并的操作。Spark shuffle分为write和read另三个 多过程。让让我们 都都先来看shuffle write。

5、最终产生的ShuffleBlockFile会有2个呢?有然后ShuffleMapTask 数量乘以reduce的数量,你这一是非常巨大的

二、编写本文的目的

Hadoop的MapReduce Shuffle和Spark Shuffle差别总结如下:

Shuffle write过程将数据分片写到对应的分片文件,这我你可不可以万事具备,只差去拉取对应的数据过来计算了。

至此整个shuffle过程完成,最后总结几点:

Map端的输出数据,先写环形缓存区kvbuffer,当环形缓冲区到达另三个 多阀值(还能够 通过配置文件设置,默认50),便要开使溢写,但溢写过就有另三个 多多sort操作,你这一sort操作先把Kvbuffer中的数据按照partition值和key另三个 多关键字来排序,移动的有然后索引数据,排序结果是Kvmeta中数据按照partition为单位聚集在同時 ,同一partition内的按照key有序。

对于基于MapReduce编程范式的分布式计算来说,本质上而言,有然后在计算数据的交、并、差、聚合、排序等过程。而分布式计算分而治之的思想,让每个节点只计算每项数据,也有然后只避免另三个 多分片,那么要想求得某个key对应的全量数据,那就都要把相同key的数据汇集到同另三个 多Reduce任务节点来避免,那么Mapreduce范式定义了另三个 多叫做Shuffle的过程来实现你这一效果。

上图的Map的输出的文件被分片为红绿蓝另三个 多分片,你这一分片的有然后根据Key为条件来分片的,分片算法还能够 被委托人实现,这类Hash、Range等,最终Reduce任务只拉取对应颜色的数据来进行避免,就实现把相同的Key拉取到相同的Reduce节点避免的功能。下面分开来说Shuffle的的各个过程。

本文旨在剖析Hadoop和Spark的Shuffle过程,并对比两者Shuffle的差异。

三、Hadoop的Shuffle过程

2、Hadoop的Shuffle是sort-base的,那么不管是Map的输出,还是Reduce的输出,就有partion内有序的,而spark何必 求你这一点。

说明:

fetch的过程过来另三个 多buffer的数据,就还能够 开使聚合了,这里就遇到另三个 多大问题,每次fetch每项数据,为何在么在能实现全局聚合呢?以word count的reduceByKey(《Spark RDD操作之ReduceByKey 》)为例,假设单词hello有三个,有然后一次fetch只拉取了另三个 多,那么为何在么在全局聚合呢?Spark的做法是用HashMap,聚合操作实际上是map.put(key,map.get(key)+1),将map中的聚合过的数据get出来相加,有然后put回去,等到所有数据fetch完,也就完成了全局聚合。

在同一核CPU执行先后执行的ShuffleMapTask还能够 共用另三个 多bucket缓冲区,有然后写到同一份ShuffleFile里去,上图所示的ShuffleFile实际上是用多个ShuffleBlock构成,那么,那么每个worker最终生成的文件数量,变成了cpu核数乘以reduce任务的数量,大大缩减了文件量。

那么有那么措施避免生成文件太大的大问题呢?有,开启FileConsolidation即可,开启FileConsolidation我你可不可以的shuffle过程如下: