第7章 mapreduce
概述
分布式并行编程
1 | •“摩尔定律”, CPU性能大约每隔18个月翻一番 |
1 | 问题:在MapReduce出现之前,已经有像MPI这样非常成熟的并行计算框架了,那么为什么Google还需要MapReduce?MapReduce相较于传统的并行计算框架有什么优势? |
MapReduce模型简介
1 | •MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce |
Map和Reduce函数

MapReduce体系结构
1 | MapReduce体系结构主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task |
Client
1 | •用户编写的MapReduce程序通过Client提交到JobTracker端 |
JobTracker
1 | •JobTracker负责资源监控和作业调度 |
TaskTracker
1 | •TaskTracker会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等) |
Task
1 | Task分为Map Task 和Reduce Task 两种,均由TaskTracker 启动 |
MapReduce工作流程
工作流程概述

1 | •不同的Map任务之间不会进行通信 |
MapReduce各个执行阶段
1 | split:是逻辑分割,如起点,长度 |
关于Split(分片)
1 | HDFS以固定大小的block为基本单位存储数据,而对于MapReduce 而言,其处理单位是split。split 是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。 |
Map任务的数量
1 | •Hadoop为每个split创建一个Map任务,split 的多少决定了Map任务的数目。大多数情况下,理想的分片大小是一个HDFS块 |

Reduce任务的数量
1 | •最优的Reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目 |
Shuffle过程详解
Shuffle过程简介

Map端的Shuffle过程
1 | •每个Map任务分配一个缓存 |
1 | 合并(Combine)和归并(Merge)的区别: |
Reduce端的Shuffle过程
1 | •Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据 |
MapReduce应用程序执行过程

1 | 中间的输出是输出到磁盘不是hdfs!!! |
实例分析:WordCount
WordCount程序任务
WordCount设计思路
1 | • 首先,需要检查WordCount程序任务是否可以采用MapReduce来实现 |
一个WordCount执行过程的实例
用户没有定义Combiner时
用户有定义Combiner时
MapReduce的具体应用
1 | MapReduce可以很好地应用于各种计算问题 |
用MapReduce实现关系的自然连接

1 | • 假设有关系R(A,B)和S(B,C),对二者进行自然连接操作 |
MapReduce编程实践
任务要求
1 | 文件A的内容如下: |
1 | 文件B的内容如下: |
1 | 期望结果如右侧所示: |
编写Map处理逻辑
1 | •Map输入类型为<key,value> |
1 | public static class MyMapper extends Mapper<Object,Text,Text,IntWritable>{ |
编写Reduce处理逻辑
1 | •在Reduce处理数据之前,Map的结果首先通过Shuffle阶段进行整理 |
1 | public static class MyReducer extends |
编写main方法
1 | public static void main(String[] args) throws Exception{ |
完整代码
1 | import java.io.IOException; |
编译打包代码以及运行程序
1 | 实验步骤: |
1 | Hadoop 2.x 版本中的依赖 jar |
1 | 将 Hadoop 的 classhpath 信息添加到 CLASSPATH 变量中,在 ~/.bashrc |
如何使用Eclipse编译运行MapReduce程序?
Hadoop中执行MapReduce任务的几种方式
1 | •Hadoop jar |