Hadoop三大组件之MapReduce(一)

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阶段

  1. 读取输入数据并按行处理。
  2. 按空格切分每一行,生成键值对(KV对)。
  3. 将KV对按键分区,分发到不同的Reduce任务。

Reduce阶段

  1. 每个Reduce任务接收并处理来自Map阶段的输出数据。
  2. 统计以特定字母开头的单词数量。
  3. 将结果输出到文件。

案例流程

  • 输入数据:一个包含多个单词的文本文件。
  • 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
2. Map阶段

在Map阶段,Mapper会处理每个Split,并将每个单词映射为键值对(KV对)。

2.1 Mapper处理

对于每个Split中的每一行,Mapper会按空格分隔单词,并生成中间的KV对。例如:

  • 对于Split 1: apple banana grape

    • 生成 KV 对:
      • (apple, 1)
      • (banana, 1)
      • (grape, 1)
  • 对于Split 2: orange kiwi banana

    • 生成 KV 对:
      • (orange, 1)
      • (kiwi, 1)
      • (banana, 1)
  • 对于Split 3: apple orange peach

    • 生成 KV 对:
      • (apple, 1)
      • (orange, 1)
      • (peach, 1)
  • 对于Split 4: kiwi banana zebra

    • 生成 KV 对:
      • (kiwi, 1)
      • (banana, 1)
      • (zebra, 1)
  • 对于Split 5: grape orange

    • 生成 KV 对:
      • (grape, 1)
      • (orange, 1)
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阶段的数据处理流程。
相关推荐
天上的光4 分钟前
数据库原理
数据库
jinan88613 分钟前
企业的移动终端安全怎么管理?
大数据·网络·安全·数据分析·开源软件
weixin_3077791331 分钟前
C#实现HiveQL建表语句中特殊数据类型的包裹
开发语言·数据仓库·hive·c#
alksql1 小时前
架构思路法
数据库·架构
Lethehong1 小时前
崖山YashanDB:下一代国产分布式数据库的架构革新与行业实践
数据库·分布式·架构
GoingYoo1 小时前
MySQL原理:逻辑架构
数据库·sql·mysql
叶辰 .1 小时前
ES使用聚合aggregations实战(2025.04.02更新)
大数据·elasticsearch·jenkins
zxsz_com_cn1 小时前
风电行业预测性维护解决方案:AIoT驱动下的风机健康管理革命
大数据·运维·人工智能
爱的叹息1 小时前
针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结
数据库·sql·性能优化
island13141 小时前
【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石
linux·运维·数据库