说明:
在每一章节的重点概括,是笔者理解,感觉比较重要的内容,仅供笔者复习时使用。

MapReduce框架总结目录

  • 1. MapReduce概述
    • 1.1 MapReduce定义
    • 1.2 MapReduce优缺点
    • 1.3 MapReduce核心思想
    • 1.4 MapReduce进程
    • 1.5 MapReduce编程规范
  • 2.Hadoop序列化
    • 2.1 序列化概述
    • 2.2 自定义bean对象实现序列化接口(Writable)

1. MapReduce概述

【++++++++++++++++++++++++++++++++++++++

重点:
MapRedce编程思想
了解:
Mapreduce定义,优缺点

++++++++++++++++++++++++++++++++++++++】

1.1 MapReduce定义

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。

MapReduce核心功能是将用户编写的业务逻辑代码自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

1.2 MapReduce优缺点


优点

MapReduce易于编程:它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。

良好的扩展性:当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。

高容错性:其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。

适合PB级以上海量数据的离线处理:可以实现上千台服务器集群并发工作,提供数据处理能力。


缺点

不擅长实时计算:MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果。

不擅长流式计算:流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。

不擅长DAG(有向无环图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

1.3 MapReduce核心思想

(1)分布式的运算程序往往需要分成至少❄️2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型❄️只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。

1.4 MapReduce进程

一个完整的MapReduce程序在分布式运行时有三类实例进程:

(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。

1.5 MapReduce编程规范

❄️Map阶段编程规范:

(1)用户自定义的Mapper要继承自己的父类
(2) Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3) Mapper中的业务逻辑写在map0方法中
(4) Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5) map0方法(MapTask进程) 对每一个调用一 -次

❄️Reduce阶段:

(1)用户自定义的Reducer要继承自己的父类
(2) Reducer的输入数据 类型对应Mapper的输出数据类型,也是KV
(3) Reducer的业务逻辑写在reduce0方法中.
(4) ReduceTask进程对每一组相同的组调用一-次reduce()方法

❄️Driver阶段:

相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程字相关运行参数的job对象

2.Hadoop序列化

【++++++++++++++++++++++++++++++++++++++

重点:
理解序列化以及应用

++++++++++++++++++++++++++++++++++++++】

2.1 序列化概述

❄️序列化概念:
序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。

❄️为什么要序列化:
一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。

❄️Hadoop序列化特点:

(1)紧凑 :高效使用存储空间。
(2)快速:读写数据的额外开销小。
(3)互操作:支持多语言的交互

2.2 自定义bean对象实现序列化接口(Writable)

在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在Hadoop框架内部传递一个bean对象,那么该对象就需要实现序列化接口

❄️具体实现bean对象序列化步骤如下7步:

(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方便后续用。
(7)如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序。

实现样例:

public class FlowBean implements Writable {    //定义上行流量、下行流量、总流量    private long upFlow;    private long downFlow;    private long sumFlow;    //空参构造    public FlowBean() {    }    //=====================省略属性的get()和set()===================      //序列化方法(将内存中的对象转化为字节码文件,方便在两个不同的服务器之间进行传输)    @Override    public void write(DataOutput out) throws IOException {        out.writeLong(upFlow);        out.writeLong(downFlow);        out.writeLong(sumFlow);    }    //反序列化方法(在对另一台服务器传过来的字节码文件进行反序列化,转化为内存中的对象)    @Override    public void readFields(DataInput in) throws IOException {        this.upFlow = in.readLong();        this.downFlow = in.readLong();        this.sumFlow = in.readLong();    }    @Override    public String toString() {        return upFlow + "\t" + downFlow + "\t" + sumFlow;    }}