0.0 定义
0.1 定义
MapReduce 是一个分布式运算程序的编程框架
0.2 功能
将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。
0.3 优缺点
优点
1)MapReduce 易于编程
2)良好的扩展性
3)高容错性
4)适合 PB 级以上海量数据的离线处理
缺点
1)不擅长实时计算
2)不擅长流式计算
3)不擅长 DAG(有向无环图)计算
1.0 MapReduce架构
1.1 架构图
1.1 架构的细节
主要集中MapTest(数据分发到各各节点)、ReduceTask(计算)、MapTask(结果合并)
1.2 一些问题
1.2.1 MapReduce工作流程
1.2.2 InputFormat数据输入
1.2.2.1 切片与MapTask并行度决定机制
(数据切片和选择多少节点处理的关系!)
1)问题引出
MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。
思考:1G的数据,启动8个MapTask,可以提高集群的并发处理能力。那么1K的数据,也启动8个MapTask,会提高集群性能吗?MapTask并行任务是否越多越好呢?哪些因素影响了MapTask并行度?
2)MapTask并行度决定机制
数据块:Block是HDFS物理上把数据分成一块一块。
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。
3)总结
1.2.2.2 FileInputFormat切片
(文件的切片原理!)
切片过程
切片机制
1.2.2.3 CombineTextInputFormat切片机制
(小文件的处理机制)
问题:因为小文件过多,会造成资源的浪费(一个小文件就占用一个节点的情况,是不可取的!)
解决:多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理
1.2.3 MapTask工作机制
1.2.4 shuffle工作机制
1.2.5 ReduceTask工作机制
1.2.6 结果输出
2.0 MapReduce程序的编写
2.1 Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(MapTask进程)对每一个<K,V>调用一
2.2 Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)ReduceTask进程对每一组相同k的<k,v>组调用一次reduce()方法
2.3 Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象