mapreduce的原理

来源:互联网 发布:保卫萝卜安卓数据同步 编辑:程序博客网 时间:2024/06/08 16:54

yarn调度原理:

说明:
客户端提交一个作业到Yarn上面的ResourceManager,ResourcerManager接收到请求后,为每一个job启动一个ApplicationMaster,AppcalitionMaster负责管理这个job,为这个job分配了applicationMaster后,由ApplicationMaster去请求ResourceManger申请资源,ResourceManager接受到这个请求后,根据分片信息,RM通知NM开一个container,在这个container中封装了启动这个app所需要的资源,包括内存和cpu等等,NM通知app在这个container运行,运行完了之后,由app通知RM结束运行,由RM通知NM去释放资源,并返回给client结果。

mapreduce的运行原理

整个MapReduce的过程大致分为 Map–>Shuffle(排序)–>Combine(组合)–>Reduce
wordcount为例:

Map阶段

分片(Split):map阶段的输入通常是HDFS上文件,在运行Mapper前,FileInputFormat会将输入文件分割成多个split ——1个split至少包含1个HDFS的Block(默认为64M);然后每一个分片运行一个map进行处理。

执行(Map):对输入分片中的每个键值对调用map()函数进行运算,然后输出一个结果键值对。

Partitioner:对map()的输出进行partition,即根据key或value及reduce的数量来决定当前的这对键值对最终应该交由哪个reduce处理。默认是对key哈希后再以reduce task数量取模,默认的取模方式只是为了避免数据倾斜。然后该key/value对以及partitionIdx的结果都会被写入环形缓冲区。
溢写(Spill):map输出写在内存中的环形缓冲区,默认当缓冲区满80%,启动溢写线程,将缓冲的数据写出到磁盘。

Sort:在溢写到磁盘之前,使用快排对缓冲区数据按照partitionIdx, key排序。(每个partitionIdx表示一个分区,一个分区对应一个reduce)
Combiner:如果设置了Combiner,那么在Sort之后,还会对具有相同key的键值对进行合并,减少溢写到磁盘的数据量。
合并(Merge):溢写可能会生成多个文件,这时需要将多个文件合并成一个文件。合并的过程中会不断地进行 sort & combine 操作,最后合并成了一个已分区且已排序的文件。

Shuffle阶段:

广义上Shuffle阶段横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和merge/sort过程。通常认为Shuffle阶段就是将map的输出作为reduce的输入的过程

Copy过程:Reduce端启动一些copy线程,通过HTTP方式将map端输出文件中属于自己的部分拉取到本地。Reduce会从多个map端拉取数据,并且每个map的数据都是有序的。

Merge过程:Copy过来的数据会先放入内存缓冲区中,这里的缓冲区比较大;当缓冲区数据量达到一定阈值时,将数据溢写到磁盘(与map端类似,溢写过程会执行 sort & combine)。如果生成了多个溢写文件,它们会被merge成一个有序的最终文件。这个过程也会不停地执行 sort & combine 操作。

Reduce阶段:

Shuffle阶段最终生成了一个有序的文件作为Reduce的输入,对于该文件中的每一个键值对调用reduce()方法,并将结果写到HDFS。

图形说明

原创粉丝点击