本次主要介绍MapReduce,分为上篇,下篇两个篇章
- 上篇介绍MapReduce计算模型,MapReduce编码规范及测试,程序运行模式。
- 下篇介绍MapReduce序列化,MaoReduce排序初步,Mapreduce 的分区。
1. MapReduce计算模型
- MapReduce是: 将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop 集群上。简化并行计算的编程模型,降低了开发并行应用的入门门槛。
MapReduce思想:在生活中处处可见。或多或少都曾接触过这种思想。MapReduce 的思想核心是“ 分而治之”, 适用于大量复杂的任务处理场景(大规模数据处理场景)。 即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。
- Map 负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。
可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。 - Reduce 负责“合”,即对 map 阶段的结果进行全局汇总。
- Map 负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。
举个栗子
我们要数图书馆中的所有书。你数 1 号书架,我数 2 号书架。这就是“ Map” 。我们人越多,数书就更快。现在我们到一起,把所有人的统计数加在一起。这就是“ Reduce” 。数据模型
Map: 对一组数据元素进行某种重复式的处理;
Reduce: 对 Map 的中间结果进行某种进一步的结果整理。Map 和 Reduce 为程序员提供了一个清晰的操作接口抽象描述。 通过以上两个编程接口,大家可以看出 MapReduce 处理的数据类型是key,value键值对。
2. MapReduce编码规范及测试
编程规范
用户编写的程序分成三个部分: Mapper, Reducer, Driver(提交运行 mr 程序的客户端)- Mapper 的输入输出都是数据是 KV 对的形式( KV 的类型可自定义),业务逻辑写在map()方法中的,map()方法中(maptask)对每一个(k,v)调用一次
- Reducer 的输入数据类型对应 Mapper 的输出数据类型,也是 KV, Reducer 的业务逻辑写在 reduce()方法中, Reducetask 进程对每一组相同 k 的k,v组调用一次 reduce()方法
- 用户自定义的 Mapper 和 Reducer 都要继承各自的父类
- 整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信
息的 job 对象
实例代码
- 需求:在一堆给定的文本文件中统计输出每一个单词出现的总次数,准备文件内容如下,两份
hello hadoop HDFS hadoop
Stream Stocket Hello
hadoop HDFS Stocket
- POM依赖:拷贝的时候注意POM中的提示
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>