Hadoop学习 MapReduce

MapReduce是一种分布式计算框架,核心理念是“分而治之”。它将复杂任务拆分为Map和Reduce两个阶段,Map负责数据的拆分与处理,Reduce则负责结果的汇总。程序员只需关注应用逻辑,而系统会处理并行计算的细节。MapReduce程序包含Mapper、Reducer和Driver三个部分,分别处理数据映射、数据聚合以及任务提交。执行过程中涉及MapTask和ReduceTask,分别处理map阶段和reduce阶段的数据处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapReduce  思想
MapReduce 思想在生活中处处可见。或多或少都曾接触过这种思想。
MapReduce 的思想核心是“ 分而治之”,适用于大量复杂的任务处理场景(大规模
数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思
想,而不是自己原创。
Map 负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。
可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce 负责“合”,即对 map 阶段的结果进行全局汇总。
这两个阶段合起来正是 MapReduce 思想的体现。

 

MapReduce 最大的亮点在于通过抽象模型和计算框架把需要做什么(what
need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编
程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处
理应用本身计算问题的程序代码。如何具体完成这个并行计算任务所相关的诸多
系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小
到单个节点集群的自动调度使用。

 

. MapReduce  框架结构
一个完整的 mapreduce 程序在分布式运行时有三类实例进程:
1、MRAppMaster:负责整个程序的过程调度及状态协调
2、MapTask:负责 map 阶段的整个数据处理流程
3、ReduceTask:负责 reduce 阶段的整个数据处理流程

 

 MapReduce  编程规范及示例编写
2.1. . 编程规范 编程规范
(1) 用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行 mr 程
序的客户端)
(2)Mapper 的输入数据是 KV 对的形式(KV 的类型可自定义)
(3)Mapper 的输出数据是 KV 对的形式(KV 的类型可自定义)
(4)Mapper 中的业务逻辑写在 map()方法中
(5)map()方法(maptask 进程)对每一个<K,V>调用一次
(6)Reducer 的输入数据类型对应 Mapper 的输出数据类型,也是 KV
(7)Reducer 的业务逻辑写在 reduce()方法中
(8)Reducetask 进程对每一组相同 k 的<k,v>组调用一次 reduce()方法
(9)用户自定义的 Mapper 和 Reducer 都要继承各自的父类
(10)整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信
息的 job 对象

 

定义一个 mapper 

//首先要定义四个泛型的类型
//keyin: LongWritable valuein: Text
//keyout: Text valueout:IntWritable

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
//map 方法的生命周期: 框架每传一行数据就被调用一次
//key : 这一行的起始点在文件中的偏移量
//value: 这一行的内容
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
//拿到一行数据转换为 string
String line = value.toString();
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
//将这一行切分出各个单词
String[] words = line.split(" ");
//遍历数组,输出<单词,1>
for(String word:words){
context.write(new Text(word), new IntWritable(1));
}
}
}

 

 

定义一个 reducer 

//生命周期:框架每传递进来一个 kv 组,reduce 方法被调用一次
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,
InterruptedException {
//定义一个计数器
int count = 0;
//遍历这一组 kv 的所有 v,累加到 count 中
for(IntWritable value:values){
count += value.get();
}
context.write(key, new IntWritable(count));
}
}

 

Mapper 任务 任务 执行过程详解

  第一阶段是把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切
片规划。默认情况下,Split size = Block size。每一个切片由一个
MapTask 处理。(getSplits)

第二阶段是对切片中的数据按照一定的规则解析成<key,value>对。默认规
则是把每一行文本内容解析成键值对。key 是每一行的起始位置(单位是字
节),value 是本行的文本内容。(TextInputFormat)

 第三阶段是调用 Mapper 类中的 map 方法。上阶段中每解析出来的一个
<k,v>,调用一次 map 方法。每次调用 map 方法会输出零个或多个键值对。

第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。默认是只
有一个区。分区的数量就是 Reducer 任务运行的数量。默认只有一个
Reducer 任务。

 第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对
于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、
<2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。
如果有第六阶段,那么进入第六阶段;如果没有,直接输出到文件中。

 第六阶段是对数据进行局部聚合处理,也就是 combiner 处理。键相等的键
值对会调用一次 reduce 方法。经过这一阶段,数据量会减少。 本阶段默认
是没有的 。

 

 

Reducer 任务 任务 执行过程详解
第一阶段是 Reducer 任务会主动从 Mapper 任务复制其输出的键值对。
Mapper 任务可能会有很多,因此 Reducer 会复制多个 Mapper 的输出。
第二阶段是把复制到 Reducer 本地数据,全部进行合并,即把分散的数据
合并成一个大的数据。再对合并后的数据排序。
 第三阶段是对排序后的键值对调用 reduce 方法。键相等的键值对调用一次
reduce 方法,每次调用会产生零个或者多个键值对。最后把这些输出的键
值对写入到 HDFS 文件中

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值