目录
- 一、MapReduce开发
- 1. 数据处理的过程(Map+Reduce)
- 2. 入门案例
- 二、MapReduce的高级特性
- 1. 序列化
- 2. 排序
- 3. 分区
- 4. Combiner——合并
- 5. Shuffle——洗牌
一、MapReduce开发
1. 数据处理的过程(Map+Reduce)
注意
Job=Map+Reduce,其中Map和Reduce可以有多个,部分情况允许没有Reduce
更详细的基础内容说明:
链接
2. 入门案例
示例
二、MapReduce的高级特性
1. 序列化
说明
- 定义:将对象转换为字节序列以便在分布式环境中传输、存储和处理。
- 过程:将对象写入临时存储区或者文件的形式永久保留
- 反序列化:从存储区中恢复对象的状态,以重新创建
数据类型
作用
实现自定义的数据类型
实现案例
MapReduce_Writable序列化
2. 排序
规则:
- 数字:升序
- 字符串:字典顺序
自定义排序
- 创建自定义的排序类
YourCompar.class
- Main函数设置排序类入口
job.setSortComparatorClass(YourCompar.class);
- 如果是针对对象的排序,则一般是在实体中继承WritableComparable类重写排序方法compareTo()
实现案例
数字排序
对象排序
3. 分区
规则
在MapReduce中,通过指定分区,可以将同一个分区的数据发送到同一个Reduce任务进行处理。例如,为了进行数据统计,可以将一批类似的数据发送到同一个Reduce任务中,以便在该任务中统计相同类型的数据,从而实现数据分区和统计。简单来说,就是将相同类型或有共性的数据送到一起去处理。
说明
- Mapreduce中一个分区一般只有一个输出文件
- 分区是根据Map阶段的输出<K2,V2>决定的
实现案例
分区入门案例
4. Combiner——合并
规则
Combiner本质上是一个“迷你Reduce”过程,它继承自Reducer类,并在Map任务之后、Reduce任务之前运行。Combiner的作用是对每个Map任务的输出进行局部汇总,以减少传输到Reduce任务的数据量。
作用
- 减少数据传输量:通过局部合并Map任务的输出,Combiner能够显著减少需要通过网络传输到Reduce任务的数据量,从而降低网络IO开销,提高作业执行效率。
- 优化数据倾斜:在某些情况下,由于数据倾斜问题,部分Reduce任务可能会处理特别大的数据量,导致作业性能下降。Combiner可以在Map阶段对输出结果进行局部汇总,减少倾斜数据的数量,有助于将负载更均衡地分配给不同的Reduce任务。
- 提高性能:由于Combiner在Map任务的本地执行,它能够利用局部性原理,减少数据传输的网络开销,从而提高整个MapReduce作业的性能。
说明
- 运行位置:在Map阶段之后、Reduce阶段之前运行,且通常是在每个Map任务所在的节点上本地化执行。
- 1个combiner只能处理单个Map的输出
- combiner是可选组件
- 一般情况下combiner与reduce使用相同的处理逻辑,以减少计算量。
- 部分特定场景中,可能需要注意输入输出格式的不同,数据类型的转换,以及部分汇总与全局汇总的区别,此时combiner和Reduce可能处理逻辑不同
- 部分汇总与全局汇总的区别:在某些业务场景中,Combiner可能只需要对局部数据进行简单的汇总(如求和、计数),而Reducer则需要对全局数据进行更复杂的处理(如排序、去重、关联查询等)。
实现案例
Combiner的简单实现
5. Shuffle——洗牌
待更新