MapReduce作业执行流程

x33g5p2x  于2021-03-14 发布在 MapReduce  
字(2.9k)|赞(0)|评价(0)|浏览(476)

一、MapReduce作业的执行流程

MapReduce是Hadoop运行大数据集计算的一个分布式框架,其编程遵循特定的流程,需按照要求编写mapper函数和reduce函数,有时还需要编写combiner函数和partitioner函数,然后将这些函数按照一定的规则组合在一起,形成一个作业。

我们可以在 Job 对象上面调用 submit() 方法或者 waitForCompletion() 方法来运行一个 MapReduce 作业。这些方法影藏了背后大量的处理过程。下面我们来揭开 Hadoop 背后运行一个作业的步骤。

:-:

从上面流程图整体可以看出,MapReduce作业的执行可以分为11个步骤,涉及五个独立的实体。它们在MapReduce执行过程中的主要作用是:

  • 客户端,提交 MapReduce 作业。
  • YARN 资源管理器(YARN resource manager),负责协调集群上计算机资源的分配。
  • YARN 节点管理器(YARN node manager),负责启动和监视集群中机器上的计算容器(container)。
  • MapReduce的 MRAppMaster,负责协调MapReduce 作业的任务。MRAppMaster 和 MapReduce 任务运行在容器中,该容器由资源管理器进行调度(schedule)且由节点管理器进行管理。
  • 分布式文件系统(通常是 HDFS),用来在其他实体间共享作业文件。

在集群上运行一个Job主要分为6个大步骤,11个小步骤,下面将介绍6大步骤具体内容。

[info] (1)作业提交

  • (1)步骤1和2:当提交一个作业时,YARN会调用用户API,从资源管理器(ResourceManager)中获得一个JobID(或Application ID)
  • (2)步骤3:然后客户端检查作业的输出说明,计算输入分片,并将作业资源(包括JAR、配置和分片信息)复制到HDFS中
  • (3)步骤4:最后客户端调用资源管理器(ResourceManager)上submitApplication()方法提交作业

[info] (2)作业初始化

  • (1)步骤5a和5b:当资源管理器(ResourceManager)接受到 submitApplication() 方法的调用,它把请求递交给 YARN 调度器(scheduler)。调度器分配了一个容器(container),资源管理器在该容器中启动MRAppMaster进程,该进程被节点管理器管理。(MRAppMaster即为MapReduce Application Master),其本质上是一个Java应用程序,其main函数类MRAppMaster。
  • (2)步骤6:MRAppMaster通过创建一定数量的簿记对象(bookkeeping object)跟踪作业进度来初始化作业,该簿记对象接受任务报告的进度和完成情况。
  • (3)步骤7:接下来,MRAppMaster从共享文件系统中获取客户端计算的输入切片,有多少个切片,MapReduce就会自动创建多少个Map任务,而reduce任务的数量受mapreduce.job.reduces属性控制。

[info] (3)任务分配

  • (1)uberized任务:MRAppMaster决定如何运行构成MapReduce作业的各个任务,当作业比较小时,MRAppMaster会在一个JVM中按顺序运行任务,这样会比在新的容器中运行和分配、并行计算的开销还小,这样的任务就是uberized任务。但是在实际生产中,基本不会遇到这样的小任务,MapReduce只有在处理大量数据的时候才能体现自身的优势。
  • (2)步骤8:如果作业不适合以uberized任务运行,该作业中的所有map任务和reduce任务就会通过MRAppMaster向资源管理器请求容器,并通过心跳机制获取返回的心跳信息,该信息包含block块机架信息、map任务的输入切片位置等,这决定了map获取数据的位置。然后资源调度器根据这些信息进行调度决策,决定将任务分配到哪一个具体的节点以及相应的内存需求。

[info] (4)任务执行

  • (1)步骤9:当资源调度器为map任务和reduce任务分配容器后,MRAppMaster会发送消息给NodeManager,并启动容器。
  • (2)步骤10:MRAppMaster在执行任务时,需要将任务的资源本地化,包括作业的配置信息、JAR文件和所有来自分布式缓存的文件。
  • (3)步骤11:获取了资源后,再运行map任务或reduce任务,具体的任务都是有YarnChild Java主程序来执行。

[info] (5)进度和状态更新

  • YarnChild在执行任务时,会每隔3秒就通过umbilical接口向MRAppMaster汇报进度和状态。客户端每一秒查询一次MRAppMaster接收更新进度的信息,这部分信息一般会暴露给用户。

[info] (6)作业完成

  • 客户端会每隔5秒检查作业是否已完成。作业完成后,与作业相关的缓存数据和信息不会被系统保存,MRAppMaster和任务运行的容器也会清除和管理自身的工作状态。作业的历史信息会作为历史数据保存在作业历史服务器上,方便用户查看历史任务等相关信息。

[warning] Job运行失败的情况

在测试环境中使用少量数据集进行代码测试可以得到理想结果,而实际情况是,用户代码抛出异常、进程崩溃、机器故障等,主要有以下四种情况失败:

  • (1)任务运行失败
    • JVM运行map任务或reduce任务时,可能会出现运行异常而突然退出,此时该任务会反馈给MRAppMaster并标记为失败。但这并不意味着该任务已经执行失败,失败的任务会被重新调起执行,在进行4次尝试后才会被认为是失败的任务。
  • (2)MRAppMaster运行失败
    • MRAppMaster是通过心跳机制检测运行失败与否,其会定期向资源管理器发送心跳信息。如果MRAppMaster发生故障无法发送心跳,资源管理器将检测到该故障并在一个新的容器中开始一个新的MRAppMaster实例。新的MRAppMaster实例可以获取失败的MRAppMaster实例中的任务状态,而不用重新执行一遍所有任务。
  • (3)NodeManager运行失败
    • 如果NodeManager运行失败,就会停止向资源管理器发送心跳信息,并被移除可用节点资源管理器池。如果一个NodeManager运行任务失败次数过高,当默认值为3次时,那么该NodeManager运行任务的失败次数过高,当默认值为3次时,那么该NodeManager将会被MRAppMaster拉入黑名单,该黑名单由MRAppMaster管理。
  • (4)ResouceManager运行失败
    • ResouceManager运行失败是非常严重的,我们的NodeManager、MRAppMaster、作业和任务容器都将无法启动。为了避免出现这种情况,在搭建生产环境的时候就要考虑到这个问题。最新的Hadoop已经解决了这个问题,我们只需要在部署生产环境的时候搭建多个ResourceManager实现其高可用性。

相关文章

微信公众号

最新文章

更多