MapReduce实现原理

一、MapReduce1.x架构

大数据开发1--MapReduce计算框架

  • Job:用户的每一个计算请求,称为一个作业。
  • JobTracker:负责接收用户提交的作业,负责启动、跟踪任务执行。
      作为作业的管理者,它将作业分解成很多Task并分派给TaskTracker进行运行,Task包含MapTask和ReduceTask。
      它还需要完成作业的监控以及容错处理(task作业挂掉了,会重启task)。如果在一定的时间内,JobTracker没有收到某个TaskTracker的心跳信息的话,就会判断该TaskTracker挂掉了,然后就会将该TaskTracker上运行的任务指派到其他的TaskTracker上去执行。
  • TaskTracker:负责执行由JobTracker分配的任务,管理各个任务在每个节点上的执行情况。
      MapTask和ReduceTask都是在TaskTracker上运行的,TaskTracker可以与JobTracker进行交互,例如执行、启动或停止作业以及发送心跳信息给JobTracker等。
  • MapTask:
      我们自己开发的Map任务会交由该Task完成,它会解析每条记录的数据,然后交给自己编写的Map方法进行处理,处理完成之后会将Map的输出结果写到本地磁盘。不过有些作业可能只有map没有reduce,这时候一般会将结果输出到HDFS文件系统里。
  • ReduceTask:
      将MapTask输出的数据进行读取,并按照数据的规则进行分组,然后传给我们自己编写的reduce方法处理。处理完成后默认将输出结果写到HDFS。

作业提交过程:

  1. 命令行提交:调用JobClient.runJob()方法提交作业到JobTracker。
  2. 作业上传:在提交到JobTracker之前需要完成相关的初始化工作(获取用户作业的Job_Id,创建HDFS目录等)
  3. 产生切片文件:作业提交后,JobClient调用InputFormat中的getSplits()方法产生用户数据的split分片信息(64M/每片)
  4. 提交作业到JobTracker:JobClient通过RPC将作业提交到JobTracker作业调度器中。然后通过TaskScheduler初始化作业,JobTracker收到提交的作业后,会交给TaskScheduler调度器,按照一定的策略对作业执行初始化操作。

二、MapReduce2.x架构

  在MapReduce2.x架构中,JobTracker和TaskTracker已经不存在了,取而代之的是ResourceManager和NodeManager。不仅架构变了,功能也变了,2.x之后新引入了YARN,在YARN之上我们可以运行不同的计算框架,不再是1.x那样只能运行MapReduce了。

YARN

  yarn是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
  YARN的基本思想是将JobTracker的两个主要功能(资源管理作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的DAG(有向无环图)。
  Yarn主要由ResourceManager、NodeManager、ApplicationMaster 和 Container 等几个组件构成。

RM:

ResourceManager(RM)是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,AM)。

Scheduler:

Scheduler是一个资源调度器,它主要负责协调集群中各个应用的资源分配,保障整个集群的运行效率。Scheduler的角色是一个纯调度器,它只负责调度Containers,不会关心应用程序监控及其运行状态等信息。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。

AM:

ApplicationMaster的主要作用是

  • 与RM调度器协商以获取资源(Container);
  • 将得到的任务进一步分配给内部的任务Task(资源的二次分配);
  • 与NM通信以启动/停止任务;
  • 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

NM:

NodeManager进程运行在集群中的节点上,每个节点都有自己的NodeManager。NodeManager是一个slave服务:

  • 接收ResourceManager的请求,分配Container给应用的某个任务
  • 和ResourceManager交换信息以确保整个集群平稳运行。ResourceManager就是通过收集每个NodeManager的报告信息来追踪整个集群健康状态的,而NodeManager负责监控自身的健康状态。
  • 管理每个Container的生命周期
  • 管理每个节点上的日志

Container:

Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

大数据开发1--MapReduce计算框架

应用程序的执行过程:

  1. 客户端程序向ResourceManager提交应用并请求一个ApplicationMaster实例 。
  2. ResourceManager找到可以运行一个Container的NodeManager,并在这个Container中启动ApplicationMaster实例。
  3. ApplicationMaster向ResourceManager进行注册,注册之后客户端就可以查询ResourceManager获得自己ApplicationMaster的详细信息,以后就可以和自己的ApplicationMaster直接交互了。
  4. 在平常的操作过程中,ApplicationMaster根据resource-request协议向ResourceManager发送resource-request请求,当Container被成功分配之后,ApplicationMaster通过向NodeManager发送container-launch-specification信息来启动Container
  5. container-launch-specification信息包含了能够让Container和ApplicationMaster交流所需要的资料
  6. 应用程序的代码在启动的Container中运行,并把运行的进度、状态等信息通过application-specific协议发送给ApplicationMaster
  7. 在应用程序运行期间,提交应用的客户端主动和ApplicationMaster交流获得应用的运行状态、进度更新等信息,交流的协议也是application-specific协议
  8. 一但应用程序执行完成并且所有相关工作也已经完成,ApplicationMaster向ResourceManager取消注册然后关闭,用到所有的Container也归还给系统

相关文章:

  • 2021-05-27
  • 2021-12-08
  • 2021-08-31
  • 2022-01-09
  • 2022-12-23
  • 2022-12-23
  • 2021-11-19
  • 2022-12-23
猜你喜欢
  • 2021-05-26
  • 2021-07-21
  • 2021-04-30
  • 2022-01-14
  • 2021-09-27
相关资源
相似解决方案