-
MapReduce的处理流程
a. 在runner类中设置输入和输出路径,输入路径可以是文件,也可以是文件夹,对文件或文件夹中的所有目录,交给job设定的InputFormat进行处理b. 程序根据InputFormat将文件分割成一个个Split,一个Split是一个Maptask,每个Map task有一个环形的内存缓冲区,输入数据经过map阶段处理后的中间结果会写入该内存缓冲区,并且决定数据写入到哪个分区(也就是最终交给哪个Reduce task来完成),这是由设置的Partition来完成的。
c. 当一个Map task写入其缓冲区的数据达到阈值,会启动一个线程将内存数据写入磁盘(这期间Map仍然在不断将数据写入缓冲区),生成一个溢写文件,这个过程称为溢写
d. 在溢写的开始后,会对内存中的数据进行排序和合并(合并过程保证的是每个溢写文件没有相同的key值),以减少数据拉取到Reduce端的开销
e. 在Map task处理完成并完成溢写后,将所有的溢写文件进行合并形成一个溢写文件(也就是一共两次合并过程),同样保证最终形成的溢写文件没有重复的key值
f. Reduce端会不断的从jobTracker那里询问map task工作是否结束,如果结束(或者完成任务的map task的数量到达了一定的比例),则不断的从已完成的Map task端拉取数据,并不断的进行排序和合并过程,最终形成一个文件作为Reduce task的输入
g. Reduce task根据输入完成相应的操作后,通过job设置的OutputFormat进行输出
-
MapReduce的Shuffle过程
a. Shuffle是MapReduce的核心,描述了从Map task输出数据到数据输入Reduce task的这一整段过程b. 在Map端,每个Map task会有一个环形缓冲区,其输出的值会写入缓冲区并对每个值进行分区决定要处理的Reduce task端,当缓冲区内存到达阈值时候开启溢写过程将缓冲区写入到磁盘,在溢写的过程中对值进行合并,在所有Map task完成任务后,对所有的溢写文件再次进行合并,一遍Reduce task拉取
c. 在Reduce端,在Map task完成或完成数量到达一定比例后,Reduce端从Map端进行数据的拉取,并对拉取的数据不断进行和Map端相同的排序,合并过程,形成的文件作为Reduce端的输入。
d. 上述的两个过程就是发生在Map端和Reduce端的shuffle过程
MapReduce的工作过程以及Shuffle的通俗理解
最新推荐文章于 2022-08-28 18:35:51 发布