MapReduce工作机制

1 MapReduce

1概述

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

2优缺点

优点:

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

2)良好的扩展性:当计算机资源不能得到满足时,可以增加机器来扩展它的计算能力。

3)高容错性:比如一台机器挂掉了,它可以把上面的计算任务转移到另外一个节点运行,不至于这个任务运行失败。

4)适合处理PB级以上的海量数据的离线处理

缺点:

1)不擅长实时计算

2)不擅长流式计算

3)不擅长有向无环图计算

3MapReduce进程

1 MrAppMaster:负责整个程序的过程调度及状态协调。

2 MapTask:负责Map阶段的整个数据处理流程。

3 ReduceTask 负责Reduce阶段的整个数据处理流程。

4常用数据序列化类型

 

 

 

5 MapReduce编程规范

  1. Mapper阶段

    1) 用户自定义的Mapper要继承自己的父类

    2)Mapper的输入数据时KV对的形式(KV的类型可以自定义)

    3)Mapper中的业务逻辑写在map()方法中

    4)Mapper的输出数据时KV对的形式

    5)map()方法(MapTask进程)对每一个<K,V>调用一次

    2 Reducer阶段

    1)用户自定义的Reducer要继承自己的父类

    2)Reducer的输入类型对于Mapper的输出数据类型,也是KV

    3)Reducer的业务逻辑写在reducer()方法中

    4)ReducerTask进程对每一组相同k的<k,v>组调用一次reduce()方法

    3 Driver阶段

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

    2Hadoop序列化

    1 概述

    序列化:就是把内存的是对象,转化成字节序列以便于存储到磁盘和网络传输。

    反序列化:就是将收到字节序列或者是磁盘的持久化数据,转换成内存中的对象。

    为什么要序列化

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

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

    1. 必须实现Writable接口

    2. 反序列化是,需要调用空参构造函数,所以必须有空参构造

    3. 重写序列化方法 write(DataOutput out)

    4. 重写反序列方法 readFields(DataInput in)

    5. 序列化的顺序和反序列化的顺序完全一致

    6. 要想把结果显示在文件中,需要重写toSring()

    7. 如果需要定义的bean放在key中传输,则还需要实现Comparable接口,MapReduce中的Shuffle过程要求对key必须能

MapReduce框架原理

MapTask并行度决定机制

1 数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。

2 数据切片:数据切片只是在逻辑上对输出进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。

 

 

 

 

Job提交源码的流程和切片

提交信息

 

 

 

1建立连接

 

 

 

2 获取job的代理

 

 

 

 

3判断是本地运行环境还是yarn集群运行环境

 

 

 

 

提交job

 

 

 

 

 

 

1创建给集群提交数据的Stag路径

 

 

 

 

 

 

 2获取jobid ,并创建Job路径

 

 

 

 

 

 3拷贝jar包到集群

 

 

 

 

4计算切片,生成切片规划文件

 

 

 

 

 

 

5向Stag路径写XML配置文件

 

 

 

 

 

 

 

6提交Job,返回提交状态

 

 

 

 

FileInputFormat切片信息

 

 

 

 

 

 

 

 

CombineTextInputFormat切片机制

CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。

 

 

 

 

MapReduce工作流程

 

 

 

 

 

 

1 客户端通过FileInputFormat的getsplit()方法对文件进行切分,默认切分的大小是block的大小128M。

2客户端向Yarn集群提交信息 job split, wc.jar, Job.xml等信息

3 Yarn计算出MapTask的数量

4 每一个切片就会有一个MapTask,MapTask通过FileInputFormat的RecorderReader把每一行读取为<K,V>值,MapTask通过Mapper的map方法对<K,V>进行处理然后通过outputCollector写入到环形缓冲区。

5 环形缓冲区的大小默认为100M存放的是索引和数据,当数据达到缓冲区大小的80%将会进行溢出

6 在缓冲区先分区,然后在区中进行排序(快排)写入到磁盘,然后进行归并排序,形成一个MapTask的输出数据

7 多个MapTask的数据把相同分区的数据下载到ReduceTask,每个ReduceTask的数据都是一个组的,然后进行归并排序和分组。

8 然后Reducer每次读取一组通过RecodWriter的Write(k,v)把数据写到文件中

 

 

 

 

 

 

 

 

 

 

Shuffle机制

 

 

 

1:经过Map方法,把<K,V>写入到缓冲区中,缓冲区的大小100M,分别存储的是元数据和具体的数据。

2 当缓冲区容量达到百分之80的时候会发生溢写,在写到磁盘之前需要先给数据分区,然后在区中进行排序。

3一个MapTask的数据处理完之后,然后进行归并排序,每一个MapTask形成一个文件(应该是两个,一个存储元数据信息,一个存储数据)

4 Reducer把数据从磁盘拷贝到自己的内存中,如果内存满了,溢写到磁盘,然后对每个Map来的数据进行归并排序,然后按照key进行分组。

5 通过Reduce方法一次读取一组,然后通过OutPutFormat的子类RecoderWriter的Write方法写入到文件

Yarn资源调度器

 

 

 

工作机制

 

 

 

作业提交:

  1. Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业

  2. Client向RM申请一个作业id

  3. RM给Client返回job资源的提交路径和作业id。

  4. Client提交jar包,切片信息和配置文件指定到资源提交路径。

  5. Client提交资源后,向RM申请运行MrAppMaster。

作业初始化

  1. 当MR收到Clinet请求后,将该job添加到容量调度器中

    1. 某一个空闲的NM领取到该Job

      1. 该NM创建Container,并产生MRAppmaster。

        1. 下载Client提交的资源到本地

任务分配

  1. MrAppMaster向RM申请运行多个MapTask任务资源。

    1. RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。

任务运行

12.MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序.

13.MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。

14.ReduceTask向MapTask获取相应分区的数据。

15.程序运行完毕后,MR会向RM申请注销自己。

进度和状态更新

YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。

作业完成

除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。



posted @ 2020-12-19 20:00  Stk1  阅读(269)  评论(0)    收藏  举报