目录
- Step 1: 输入分片(Input Splitting)
- Step 2: Map阶段(并行处理)
- MapTask 1 处理 Block 1:
- MapTask 2 处理 Block 2:
- Step 3: Map端本地聚合(Combiner优化,可选)
- MapTask 1 合并结果:
- MapTask 2 合并结果:
- Step 4: Shuffle与排序(数据重分布)
- 假设分区规则:
- Shuffle过程:
- Step 5: Reduce阶段(全局聚合)
- ReduceTask 0 处理分区0:
- ReduceTask 1 处理分区1:
- Step 6: 输出结果
- 流程总结(附示意图)
DeepSeek:
好的!我们以经典的WordCount(词频统计)为例,通过一个具体的文本处理流程,详细说明MapReduce的工作机制。假设输入文件是两行文本:
Hello World Hello Hadoop
Goodbye Hadoop Hello MapReduce
Step 1: 输入分片(Input Splitting)
- 原始文件被HDFS存储为两个块(假设块大小为64MB,这里仅为示例简化):
- Block 1:
Hello World Hello Hadoop
- Block 2:
Goodbye Hadoop Hello MapReduce
- Block 1:
- MapReduce将每个HDFS块视为一个逻辑分片(InputSplit),启动两个MapTask(每个分片对应一个MapTask)。
Step 2: Map阶段(并行处理)
每个MapTask逐行处理输入数据,输出中间键值对 <单词, 1>
。
MapTask 1 处理 Block 1:
输入行: "Hello World Hello Hadoop"
→ 拆分为单词并输出:<Hello, 1>, <World, 1>, <Hello, 1>, <Hadoop, 1>
MapTask 2 处理 Block 2:
输入行: "Goodbye Hadoop Hello MapReduce"
→ 拆分为单词并输出:<Goodbye, 1>, <Hadoop, 1>, <Hello, 1>, <MapReduce, 1>
Step 3: Map端本地聚合(Combiner优化,可选)
为了减少网络传输,MapTask可以在本地合并相同Key的值(类似Reduce的预操作)。
MapTask 1 合并结果:
原始输出:<Hello,1>, <World,1>, <Hello,1>, <Hadoop,1>
合并后:<Hello,2>, <World,1>, <Hadoop,1>
MapTask 2 合并结果:
原始输出:<Goodbye,1>, <Hadoop,1>, <Hello,1>, <MapReduce,1>
合并后:<Goodbye,1>, <Hadoop,1>, <Hello,1>, <MapReduce,1>
Step 4: Shuffle与排序(数据重分布)
MapReduce通过Partitioner决定中间结果的分区(默认按Key的哈希值分到不同ReduceTask)。
假设分区规则:
- 分区0:处理
Goodbye
,Hadoop
,Hello
,MapReduce
- 分区1:处理
World
(仅为示例,实际哈希结果可能不同)
Shuffle过程:
- MapTask 1的输出:
- 分区0:<Hello,2>, <Hadoop,1>
- 分区1:<World,1>
- MapTask 2的输出:
- 分区0:<Goodbye,1>, <Hadoop,1>, <Hello,1>, <MapReduce,1>
- ReduceTask从所有MapTask中拉取对应分区的数据,并按Key排序:
- 分区0数据排序后:
<Goodbye,1>, <Hadoop,1>, <Hadoop,1>, <Hello,2>, <Hello,1>, <MapReduce,1>
- 分区1数据排序后:
<World,1>
- 分区0数据排序后:
Step 5: Reduce阶段(全局聚合)
每个ReduceTask处理一个分区的数据,合并相同Key的值。
ReduceTask 0 处理分区0:
输入排序数据:
<Goodbye,1>, <Hadoop,1>, <Hadoop,1>, <Hello,2>, <Hello,1>, <MapReduce,1>→ 按Key分组并累加:
<Goodbye, [1]> → <Goodbye,1>
<Hadoop, [1,1]> → <Hadoop,2>
<Hello, [2,1]> → <Hello,3>
<MapReduce, [1]> → <MapReduce,1>
ReduceTask 1 处理分区1:
输入排序数据:<World,1>
→ 直接输出:<World,1>
Step 6: 输出结果
ReduceTask将最终结果写入HDFS,生成两个文件:
- part-r-00000(分区0结果):
Goodbye 1 Hadoop 2 Hello 3 MapReduce 1
- part-r-00001(分区1结果):
World 1
流程总结(附示意图)
原始文件 → HDFS分块 → MapTask处理 → 本地合并 → 分区排序 → Shuffle传输 → Reduce聚合 → 输出
通过WordCount示例,可以看到MapReduce如何将分布式计算拆解为Map和Reduce的协作,最终高效完成海量数据的处理。