首页 理论教育 MapReduce运行流程详解

MapReduce运行流程详解

时间:2023-06-24 理论教育 版权反馈
【摘要】:MapReduce 运行流程如图4.2 所示。图4.2MapReduce 运行流程Map Task 工作原理Map Task 负责Map 阶段的整个数据处理流程,Map 阶段并行度由客户端提交作业时的切片个数决定。MapReduce 从文件系统中读取文件后,会首先对读取的文件进行输入分片的划分。Map输出数据已经是有序的,Reduce 会对Map 传递过来的数据不断地进行合并。合并完成后,便得到了Reduce 端的输入文件。Reduce Task 默认值是“1”,输出文件个数为1个。若Reduce Task 设置为“0”,表示没有Reduce 阶段,输出文件个数与map 个数一致。

MapReduce运行流程详解

MapReduce 运行流程如图4.2 所示。

图4.2 MapReduce 运行流程

(1)Map Task 工作原理

Map Task 负责Map 阶段的整个数据处理流程,Map 阶段并行度由客户端提交作业时的切片个数决定。

①Split 阶段。MapReduce 从文件系统中读取文件后,会首先对读取的文件进行输入分片(input split)的划分。输入分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组。一般情况下,以HDFS 的一个块的大小作为一个分片(也可以按split 设置值来切片)。

②一个输入分片分配给一个Map 任务。Map 任务分配完成后,再对传进来的分片进一步分解成一批键值对( <key,value>对),每一个键值对调用程序员事先编写的Map 函数进行逻辑处理,输出新的<key,value>对。

③数据处理完成后,会调用collect()进行结果的收集和输出。collect()将新生成的<key,value>对进行分区,并写入一个环形内存缓冲区中(默认为100 MB)。

④溢写。当环形内存缓冲区满后(一般为写满缓冲区大小的80%时),MapReduce 会将数据写到本地磁盘上生成一个临时文件。首先,对需要溢写的缓存区内的数据进行分区,分区的个数由Reduce 任务的个数决定,有多少个Reduce 任务就划分为多少个分区,这样可以保证Reduce 任务分到均衡的数据;然后对每个分区中的数据进行排序,经过排序后,数据按分区聚集在一起,且同一分区内所有数据按照key 有序;最后进行溢写操作。如果用户设置了Combiner,则还需要将排序后的结果以分区为单位合并成大文件,以避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的开销。

(2)Shuffle 工作原理

Shuffle 是MapReduce 最为关键的一个阶段,主要负责将Map 端生成的数据按键排好序传递到Reduce 端,包括两个部分,即Map 端的Shuffle 和Reduce 端的Shuffle。(www.xing528.com)

1)Map 端的Shuffle

将Map 输出的<key,value >对放到环形缓冲区中,当缓冲区空间写满80%时,准备将缓冲区中数据写入到磁盘,这样可以保证写入到内存缓冲区和写入到磁盘并行进行,而不用中止Map。溢写之前,先按照分区和key 等对数据进行排序,然后按分区将数据写入临时文件。如果有必要,还会进行合并操作,也就是将按分区输出的小文件合并成大文件,以提高效率。

2)Reduce 端的Shuffle

Reduce 任务通过HTTP 向各个Map 任务复制它所需要的数据,Map 任务会在内存或磁盘上对数据进行合并,Reduce 任务复制过来的数据有些放在内存中,而有些放在磁盘上。Map输出数据已经是有序的,Reduce 会对Map 传递过来的数据不断地进行合并。一般Reduce 端是一边复制数据一边合并数据,复制和合并是重叠的。合并完成后,便得到了Reduce 端的输入文件。

(3)Reduce Task 工作原理

①Reduce Task 负责Reduce 阶段的整个数据处理流程。Reduce Task 的并行度可以通过“job.setNumReduceTasks()”进行手动设置。Reduce Task 默认值是“1”,输出文件个数为1个。若Reduce Task 设置为“0”,表示没有Reduce 阶段,输出文件个数与map 个数一致。

②Reduce Task 从各个Map Task 上通过网络远程复制数据,每个Map 传来的数据都是有序的。针对复制过来的数据,如果数据量较小,则直接存放在内存中;如果数据量大小超过一定阈值,则写到磁盘上。

③为了避免内存使用过多或磁盘上存在大量小文件,在Reduce Task 进行复制的同时,会启动后台线程对内存和磁盘上的文件进行合并。因此,Reduce 端一边复制数据,一边合并数据。

④为了将key 相同的数据聚集在一起,Reduce Task 会对所有数据进行一次归并排序,将相同key 的value 值放到一个列表中,生成形如<key,list(value) >的键值对。

⑤对每一个键值对调用程序员事先编写的reduce()函数进行计算,并将结果输出到文件系统中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈