Hadoop之MapReduce
1. MapReduce是什么
MapReduce是一个分布式运算程序的编程框架,旨在帮助用户开发基于Hadoop的数据分析应用。它的核心功能是将用户编写的业务逻辑代码与自带的默认组件整合,形成一个完整的分布式运算程序,并并发运行在一个Hadoop集群上。
2. MapReduce的优点
1) 易于编程
MapReduce框架只需实现几个简单的接口,用户便可以快速开发出一个分布式程序。这使得编写分布式程序的复杂性大大降低,从而促进了MapReduce的普及。
2) 良好的扩展性
随着计算需求的增加,用户只需简单地增加机器即可提升计算能力,Hadoop会自动将任务分配到新增的节点上。
3) 高容错性
Hadoop设计时考虑到了在廉价PC机器上运行的需求,因此具备高容错性。如果某个节点宕机,Hadoop会自动将计算任务转移到其他节点上,无需人工干预。
4) 适合PB级以上海量数据的离线处理
Hadoop可以实现大规模服务器集群的并发工作,提供高效的数据处理能力。
3. MapReduce的缺点
1) 不擅长实时计算
MapReduce无法像MySQL或Oracle那样,在毫秒或秒级内快速返回查询结果,适合批处理场景而非实时应用。
2) 不擅长流式计算
MapReduce的输入数据集是静态的,无法处理动态输入数据,因此不适合流式计算场景。
3) 不擅长DAG(有向无环图)计算
对于存在依赖关系的多个应用程序,MapReduce在处理时会导致大量的磁盘IO,影响性能。
4. MapReduce核心思想
以统计单词出现次数为例,MapReduce程序通常分为两个阶段:Map阶段和Reduce阶段。
Map阶段
- 读取输入数据并按行处理。
- 按空格切分每一行,生成键值对(KV对)。
- 将KV对按键分区,分发到不同的Reduce任务。
Reduce阶段
- 每个Reduce任务接收并处理来自Map阶段的输出数据。
- 统计以特定字母开头的单词数量。
- 将结果输出到文件。
案例流程
- 输入数据:一个包含多个单词的文本文件。
- Map阶段将这些单词分为不同的分区,例如:
- 分区1:以a-p开头的单词
- 分区2:以q-z开头的单词
- Reduce阶段统计每个分区的单词数量,输出结果到文件。
假设我们有一个文本文件,内容如下:
apple banana grape
orange kiwi banana
apple orange peach
kiwi banana zebra
grape orange
1. InputFormat
- InputFormat 将读取这个文本文件,并将其分割成多个Splits。假设每行作为一个Split。
- Split 1:
apple banana grape
- Split 2:
orange kiwi banana
- Split 3:
apple orange peach
- Split 4:
kiwi banana zebra
- Split 5:
grape orange
- Split 1:
2. Map阶段
在Map阶段,Mapper会处理每个Split,并将每个单词映射为键值对(KV对)。
2.1 Mapper处理
对于每个Split中的每一行,Mapper会按空格分隔单词,并生成中间的KV对。例如:
-
对于Split 1:
apple banana grape
- 生成 KV 对:
(apple, 1)
(banana, 1)
(grape, 1)
- 生成 KV 对:
-
对于Split 2:
orange kiwi banana
- 生成 KV 对:
(orange, 1)
(kiwi, 1)
(banana, 1)
- 生成 KV 对:
-
对于Split 3:
apple orange peach
- 生成 KV 对:
(apple, 1)
(orange, 1)
(peach, 1)
- 生成 KV 对:
-
对于Split 4:
kiwi banana zebra
- 生成 KV 对:
(kiwi, 1)
(banana, 1)
(zebra, 1)
- 生成 KV 对:
-
对于Split 5:
grape orange
- 生成 KV 对:
(grape, 1)
(orange, 1)
- 生成 KV 对:
2.2 生成的中间KV对
经过Mapper处理,所有中间的数据可能如下所示:
(apple, 1)
(banana, 1)
(grape, 1)
(orange, 1)
(kiwi, 1)
(banana, 1)
(apple, 1)
(orange, 1)
(peach, 1)
(kiwi, 1)
(banana, 1)
(zebra, 1)
(grape, 1)
(orange, 1)
3. Shuffle阶段
Shuffle阶段负责将这些中间的KV对根据键进行分组和排序。
3.1 分区逻辑
将相同键的所有中间KV对聚集到一起,并根据字母范围进行分区:
-
分区1(a-q):
apple
:(apple, 1)
,(apple, 1)
banana
:(banana, 1)
,(banana, 1)
,(banana, 1)
grape
:(grape, 1)
,(grape, 1)
kiwi
:(kiwi, 1)
,(kiwi, 1)
orange
:(orange, 1)
,(orange, 1)
peach
:(peach, 1)
-
分区2(r-z):
zebra
:(zebra, 1)
4. Reduce阶段
Reduce阶段会有两个Reducer,分别处理这两个分区的数据。
4.1 ReduceTask处理
-
ReduceTask 1(处理分区1 a-q)
- 输入:
(apple, 1) (apple, 1) (banana, 1) (banana, 1) (banana, 1) (grape, 1) (grape, 1) (kiwi, 1) (kiwi, 1) (orange, 1) (orange, 1) (peach, 1)
- 处理统计数量,输出:
apple: 2 banana: 3 grape: 2 kiwi: 2 orange: 2 peach: 1
- 输入:
-
ReduceTask 2(处理分区2 r-z)
- 输入:
(zebra, 1)
- 处理输出:
zebra: 1
- 输入:
5. 输出
最终结果将被写入到HDFS中的指定文件,格式如下:
apple: 2
banana: 3
grape: 2
kiwi: 2
orange: 2
peach: 1
zebra: 1
5. MapReduce运行三大进程
MapReduce运行时的进程包括:
- MrAppMaster:负责整体程序的调度和状态协调。
- MapTask:负责Map阶段的数据处理流程。
- ReduceTask:负责Reduce阶段的数据处理流程。