目录
1、MapReduce基础
1.1 什么是MapReduce
- 是一个分布式计算框架,它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务
- 适用于大规模数据处理场景:每个节点处理存储在该节点的数据(移动数据不如移动计算)
- 每个job包含Map和Reduce两部分
1.2 MapReduce的设计思想
- 分而治之:简化并行计算的编程模型
- 构建抽象模型map和reduce:开发人员专注于实现Mapper和Reducer函数
- 隐藏系统层细节:开发人员专注于业务逻辑实现
1.3 MapReduce特点
- 优点
- 易于编程
- 可扩展性
- 高容错性
- 高吞吐量
- 不适用领域
- 难以实时计算
- 不适合流式计算
- 不适合DAG(有向图)计算
2、MapReduce编程规范
需要重点明确两点:
- 1.一个记录调用一次 map()方法。
- 2.相同的 key 调用一次 reduce()方法。
用户编写的程序分成三个部分:Mapper、Reducer和Driver
- Mapper
- MapReduce框架处理的数据格式是<K,V>键值对形式
- Map端接收<K,V>键值对数据,经过处理输出新的<K,V>键值对
- Map端处理逻辑写在Mapper类中的map()方法中
- Reducer
- Reduce端搜集多个Mapper端输出的<K,V>数据,进行汇总
- Reducer的业务逻辑写在reduce()方法中
- 每一组相同k的<k,Iterator>组调用一次reduce()方法
- Driver
- 整个程序需要编写一个Driver来进行提交
- 将自定义Mapper和Reducer类组合成一个job,并提交job对象
MapReduce编程三部曲
-
输入Input。MapReduce输入一系列k1/v1。
-
Map和Reduce阶段:
map: (k1,v1) → list (k2,v2)
reduce: (k2,list(v2)) → list (k3,v3)
其中k2/v2是中间结果对。 -
输出Output:MapReduce输出一系列k2/v3
3、MapReduce词频统计编程实例
需求:使用MapReduce编程完成词频统计,文档内容如下:
Hello Hadoop BigData
Hello Hadoop MapReduce
Hello Hadoop HDFS
BigData Perfect
步骤:
1、编写Java代码(包括Mapper、Reducer、Job)
2、将java代码打包上传至Linux系统执行
hadoop jar WCMR.jar cn.kgc.WCDriver /user/data /user/out
# WCMR.jar:指定jar包
# cn.kgc.WCDriver:指定Job
# /user/data:输入路径
# /user/out:输出路径
拓展:常用的数据类型对应的 hadoop 数据序列化类型
Java 类型 | Hadoop Writable 类型 |
---|---|
boolean | BooleanWritable |
byte | ByteWritable |
int | IntWritable |
float | FloatWritable |
long | LongWritable |
double | DoubleWritable |
string | Text |
map | MapWritable |
array | ArrayWritable |
3.1 新建maven工程,添加pom文件依赖关系
版本号根据需求填写,代码如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0</version>