(1)分布式的运算程序往往需要分成只少2个阶段
(2)第一个阶段的MapTask并发实例。完全并行运行,互补相干
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,只能多个MapReduce程序,串行运行。
一个完整的MapReduce程序在分布式运行时有三类实例进程
(1)MrAppMaster:复制整个程序的过程调度及状态协调
(2)MapTask:负责Map阶段的整个数据处理流程
(3)ReduceTask:负责Reduce阶段的整个数据处理流程
用户编写的程序分成三个部分:Mapper、Reduce和Driver
1.Mapper阶段:
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的数据数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(MapTask进程)对每一个
2. Reduce阶段
(1)用户自定义的Reduce要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)ReduceTask进程对每一组相同的k的
3.Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN 集群,提交的是封装了MapReduce程序相关运行参数的job对象