MapReduce工作流程是Hadoop中处理大规模数据集的核心机制,其设计旨在将复杂的计算任务分解为两个主要阶段:Map(映射)和Reduce(归约),以及一个中间阶段Shuffle(洗牌排序)。下面是MapReduce工作流程的详细步骤:
-
输入分片(Input Split):
- 输入数据首先被逻辑上切分成多个部分,称为输入分片(Input Split)。这些分片通常与HDFS的块大小相对应,但不严格绑定,一个分片可能包含一个或多个块的数据。
-
映射(Map)阶段:
- 对于每个输入分片,Hadoop创建一个Map任务。
- Map任务通过
RecordReader
读取分片中的数据,并将数据解析成键值对(key-value pairs)。 Mapper
类中的map()
函数被调用,对每一对键值数据执行特定的操作或计算,生成新的中间键值对。- 这些中间结果被暂时存储在本地磁盘上,准备进入下一阶段。
-
洗牌(Shuffle)阶段:
- 包括排序、分区和合并等步骤。
- 排序:在每个Map任务的输出中,相同键的所有键值对被排序。
- 分区:排序后的键值对根据键进行分区,准备发送到相应的Reduce任务。
- 合并(Combine):可选步骤,部分聚合Map输出,减少网络传输的数据量。
- 之后,这些数据通过网络传输到Reduce任务所在节点。
-
归约(Reduce)阶段:
- 在每个Reduce任务中,来自不同Map任务、具有相同键的所有值被聚集在一起。
Reducer
类中的reduce()
函数对这些键对应的值列表执行聚合操作,比如求和、平均值或进行其他更复杂的操作。reduce()
的输出是最终结果的一部分,通常是更紧凑、更精炼的数据形式。
-
输出:
- 最终的键值对被
RecordWriter
写入到HDFS或其他存储系统中,形成输出结果。
- 最终的键值对被
-
故障恢复:
- 在整个过程中,Hadoop框架提供了容错机制,如果某个任务失败,会自动重新调度执行。
通过这样的流程,MapReduce能够高效地处理海量数据,支持高度并行化,同时保证了计算的可靠性。此外,由于Map和Reduce操作的明确分离,程序员可以专注于实现这两个阶段的逻辑,而不需要关注底层的并行处理和数据分布细节。