- 分布式的运算程序往往需要分成至少 2 个阶段第一个阶段的 MapTask 并发实例,完全并行运行,互不相干第二个阶段的 ReduceTask 并发实例互不相干,但是他们的数据依赖于上一个阶段的所有 MapTask 并发实例的输出MapReduce 编程模型只能包含一个 Map 阶段和一个 Reduce 阶段,如果用户的业务逻辑非常复杂,那就只能多个 MapReduce 程序,串行运行。
一个完整的 MapReduce 程序在分布式运行时有三类实例进程:
- MrAppMaster :负责整个程序的过程调度及状态协调MapTask :负责 Map 阶段的整个数据处理流程ReduceTask :负责 Reduce 阶段的整个数据处理流程
用户编写的程序分为三个部分:Mapper、Reducer 和 Driver。
Mapper阶段
用户自定义的Mapper要继承自己的父类 Mapper的输入数据是KV对的形式(KV的类型可自定义) Mapper中的业务逻辑写在map()方法中 Mapper的输出数据是KV对的形式(KV的类型可自定义) map()方法(MapTask进程)对每一个调用一次
Ruducer 阶段
用户自定义的Reducer要继承自己的父类 Reducer的输入数据类型对应Mapper的输出数据类型,也是KV Reducer的业务逻辑写在reduce()方法中 ReduceTask进程对每一组相同k的组调用一次reduce()方法
Driver 阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群 提交的是封装了MapReduce程序相关运行参数的job对象
序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换
具体实现 bean 对象序列化步骤如下 7 步:
- 必须实现 Writable 接口反序列化时,需要反射调用空参构造函数,所以必须有空参构造重写序列化方法 write重写反序列化方法 readFields注意反序列化的顺序和序列化的顺序完全一致要想把结果显示在文件中,需要重写 toString(),可用"t"分开,方便后续用如果需要将自定义的 bean 放在 key 中传输,则还需要实现 Comparable 接口,因为 MapReduce 框中的 Shuffle 过程要求对 key 必须能排序



