MapReduce

MapReduce 核心思想:分治

  • Map:负责分,即把复杂的任务分解为若干个简单的任务来并行处理。拆分前提为这些小任务可以进行并行计算,彼此之间几乎没有依赖关系。

  • Reduce: 负责合,对map阶段的结果进行全局汇总,最后进行数据输出。

Map和Reduce这两个阶段和一起就是MapReduce的思想体现。

1559485410534

MapReduce编程的八个步骤

Map 阶段: 分的步骤

  • 第一步:读取文件,将其解析为key/valuek1/v1,并将 k1/v1输出到第二步

  • 第二步:自定义map逻辑,处理第一步发过来的 k1/v1,自定义处理逻辑进行处理,处理后变为k2/v2,输出到第三步

Shuffle阶段: 分组阶段

  • 第三步:分区,对k2/v2进行分区,相同的key将会发送到同一个Reduce中,形成一个集合

  • 第四步:排序,对上述集合进行字典排序

  • 第五步:规约,主要在map端对数据做一次聚合,减少我们输出key2的数据量

  • 第六步:分组,将相同的数据发送到同一组里面去调用一次reduce逻辑

**Reduce阶段:**合的步骤

  • 第七步:自定义reduce逻辑,接收k2/v2,将其转换为k3/v3进行输出

  • 第八步:输出,将reduce处理完成的数据进行输出

每个步骤都对应一个Class类,将八个类组织到一起就是MapReduce程序

单词统计MapReduce编程示例

代码可以参考:https://github.com/xf616510229/hadoop-study/tree/master/wordcount

无标题

0. 添加测试数据 wordcount.txt到hdfs

1. 创建JobMain对象,此对象代表一个MapReduce任务,负责将八大步骤(八个类)编织为一个流程

2. 创建WordCountMapper对象,主要负责map工作,将k1/v1转换为k2/v2:

3. 创建WordCountReducer对象,主要负责reduce合的操作,将k2/v2转换为k3/v3:

MapReduce的分区

在MapReduce八大编程步骤中,第三步为分区,对k2/v2进行分区,相同的key将会发送到同一个Reduce中,形成一个集合。

分区主要将相同的数据发送到同一个reduce中。

最后更新于

这有帮助吗?