「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」
上一篇介绍了hadoop的基本结构和主要组成部分,分别是HDFS和MapReduce,MapReduce作为大数据存储、计算的核心功能,本篇介绍一下其中的原理和过程详细解析。
MapReduce的过程可以分解为split分片、MapTask、Shuffle、ReduceTask。
MapTask包含Read、map、collect(分区排序)、spill(溢写)、combine(合并),再到归并,接下来进入Reduce的过程。
分区、排序、溢出、归并的过程解析
一个分片在一个maptask内,数据超过80M不断溢出到本地磁盘,且进行分区和排序,并写入本地磁盘文件, 如第一次溢出到第一个文件中,过程中进行分区和排序,分为分区1和分区2,且每个分区内的数据都已排序完成, 第二次溢出到第二个文件中也是分区1和分区2,且每个分区内的数据都已排序完成。 此时多个文件会归并成一个大文件,如何归并?将分区相同的数据合并到一起,并且重新对分区内的数据进行排序,这样合并成一个 大文件,包含分区1和分区2,且分区内的数据排序完成。
combine是可选步骤,如果有这一步,就会对同一文件中同一分区内的数据先进行合并操作再进行多文件的归并 (这里的归并也会进行相同key的合并),也就是说如果选择了combine,那么溢出到小文件的同一分区内相同key会进行value合并, 多个小文件归并成大文件时,也会进行同一分区内相同key会进行value合并。
以上是一个maptask处理的结果,多个maptask就会有多个这样的大文件,并且文件都是包含分区1和分区2,或者更多的有分区3和分区4.
最后reduce起几个任务是根据分区的数量来的,如现在每个maptask任务的结果都是包含分区1和分区2,那么就会有两个reduce。 将同一分区的不同maptask处理完成的数据导入到对应分区的reduce任务中。
合并和归并的区别
1、多个文件之间是归并操作,多个文件之间相同分区的数据归并到一起,并且排序。
2、一个小文件中,相同分区内相同key之间的合并操作。 文件a的分区1和分区2 分别做合并。key值相同的value相加在一起, 比如 分区1里面是 <a,1><a,1><b,1><c,1> 分区2里面是 <a,1><e,1><e,1><f,1> 合并操作后 分区1是 <a,2><b,1><c,1> 分区2里面是 <a,1><e,2><f,1>
在reducetask里面也是做的合并和归并操作。 从上面知道,reducetask里面的输入数据是同一分区来自不同maptask的处理结果。 此时reducetask开始作业,将多个分区先归并在一起,再按照key值将value合并到一起。