为什么我们不能在 mapper 中执行“聚合”(添加)操作?为什么我们需要“reducer”来实现这个功能?

简介: 【8月更文挑战第31天】

在Hadoop MapReduce框架中,Mapper和Reducer承担着不同的职责。Mapper的主要任务是处理输入数据并产生中间键值对,而Reducer则负责接收这些中间数据并进行聚合操作以产生最终结果。本文将详细解释为什么不能直接在Mapper中执行聚合操作,以及为什么需要Reducer来实现这一功能。

1. Mapper的角色与限制

角色:
Mapper的任务是处理原始输入数据,通常这些数据存储在HDFS上。每个Mapper独立处理数据的一个小片段,并将处理结果转换为键值对(key-value pair)。这些键值对是后续数据处理的基础。

限制:

  • 数据分发:MapReduce框架会根据键的值将Mapper的输出分发到不同的Reducer。如果Mapper试图进行聚合操作,它将只能访问有限的数据子集,无法看到全局数据。
  • 设计原则:MapReduce的设计原则是“分而治之”,其中Mapper负责“分”,即数据的初步处理和分类;Reducer负责“治”,即对分类后的数据进行深入处理和聚合。

2. 聚合的需求与挑战

需求:
在许多数据处理场景中,需要对数据进行聚合操作,如计数、求和或平均值计算。这些操作要求能够访问所有相关数据,而不仅仅是单个Mapper看到的数据子集。

挑战:

  • 数据分布:在分布式环境下,相同的键可能由多个Mapper生成,且分布在不同的节点上。
  • 并行处理:为了提高效率,MapReduce框架需要能够并行处理数据。如果聚合操作在Mapper中进行,将无法充分利用集群的并行处理能力。

3. Reducer的作用

数据整合:
Reducer的核心作用是接收所有Mapper的输出,并根据键的值将这些数据整合在一起。这样,Reducer可以访问所有具有相同键的值,从而进行全局的聚合操作。

全局视角:
由于Reducer可以访问所有Mapper的输出,它拥有全局视角,能够执行需要全局信息的聚合操作。例如,统计一个特定键的出现次数或计算总和。

4. 高效性和容错性

高效性:
通过将聚合操作移至Reducer,MapReduce框架可以更高效地执行数据处理任务。Reducer可以并行处理不同键的数据,同时框架会自动处理数据分发和负载均衡。

容错性:
MapReduce框架为Reducer提供了容错机制。如果某个Reducer失败,框架可以重新调度该任务至其他节点,确保数据处理的正确完成。

结论

综上所述,Mapper和Reducer在MapReduce框架中扮演着不同的角色。Mapper专注于数据的初步处理和分类,而Reducer负责数据的深入处理和聚合。这种设计不仅符合“分而治之”的原则,而且能够充分利用集群的并行处理能力,提高数据处理任务的效率和容错性。因此,我们不能在Mapper中执行聚合操作,而是需要Reducer来实现这一功能,以确保数据处理的正确性和效率。

目录
相关文章
|
7月前
|
分布式计算 负载均衡 数据处理
MapReduce中的Combiner函数的作用和使用场景
MapReduce中的Combiner函数的作用和使用场景
302 0
|
2月前
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
42 3
|
7月前
|
缓存 分布式计算 Java
MapReduce编程:join操作和聚合操作
MapReduce编程:join操作和聚合操作
126 0
|
7月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
86 0
|
SQL Java 数据库连接
Mybatis 查询出来的List 集合数量正确,但是具体数据为null
Mybatis 查询出来的List 集合数量正确,但是具体数据为null
445 0
Mybatis 查询出来的List 集合数量正确,但是具体数据为null
|
存储 分布式计算 Ubuntu
|
存储 分布式计算 自然语言处理
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
|
JavaScript
使用combineReducers合并多个reducer(基础文章)
使用combineReducers合并多个reducer(基础文章)
254 0
使用combineReducers合并多个reducer(基础文章)
|
SQL Java 数据库连接
Hibernate中执行NativeSQL语句查询返回自定义类型的POJO实例的List(多表查询)
Hibernate中定义了hql的概念,简单地说就是,为java的码农提供了一套类似于sql的语法,但是数据表名变成了PO名,数据字段名变成了PO中属性成员名,并把这种语法称为hql。优点就是:hql看上去是面向对象的,码农不需要知道数据库中数据表的结构,只需要依据PO编写面向对象的数据库增删改查的语句。
4179 0