Hadoop-03 Yarn

YARN - ResourceManager

负责全局的资源管理和任务调度,把整个集群当成计算资源池,只关注分配,不管应用,且不负责容错

  • 资源管理

以前资源是每个节点分成一个个的Map slot和Reduce slot,现在是一个个Container,每个Container可以根据需要运行ApplicationMaster、Map、Reduce或者任意的程序。
以前的资源分配是静态的,目前是动态的,资源利用率更高

Container是资源申请的单位,一个资源申请格式:<resource-name, priority, resource-requirement, number-of-containers>, resource-name:主机名、机架名或*(代表任意机器), resource-requirement:目前只支持CPU和内存

用户提交作业到ResourceManager,然后在某个NodeManager上分配一个Container来运行ApplicationMaster,ApplicationMaster再根据自身程序需要向ResourceManager申请资源

YARN有一套Container的生命周期管理机制,而ApplicationMaster和其Container之间的管理是应用程序自己定义的

  • 任务调度

只关注资源的使用情况,根据需求合理分配资源
Scheluer可以根据申请的需要,在特定的机器上申请特定的资源(ApplicationMaster负责申请资源时的数据本地化的考虑,ResourceManager将尽量满足其申请需求,在指定的机器上分配Container,从而减少数据移动)

  • 内部结构
    在这里插入图片描述

Client Service: 应用提交、终止、输出信息(应用、队列、集群等的状态信息)

Adaminstration Service: 队列、节点、Client权限管理

ApplicationMasterService: 注册、终止ApplicationMaster, 获取ApplicationMaster的资源申请或取消的请求,并将其异步地传给Scheduler, 单线程处理

ApplicationMaster Liveliness Monitor: 接收ApplicationMaster的心跳消息,如果某个ApplicationMaster在一定时间内没有发送心跳,则被任务失效,其资源将会被回收,然后ResourceManager会重新分配一个ApplicationMaster运行该应用(默认尝试2次)

Resource Tracker Service: 注册节点, 接收各注册节点的心跳消息

NodeManagers Liveliness Monitor: 监控每个节点的心跳消息,如果长时间没有收到心跳消息,则认为该节点无效, 同时所有在该节点上的Container都标记成无效,也不会调度任务到该节点运行

ApplicationManager: 管理应用程序,记录和管理已完成的应用

ApplicationMaster Launcher: 一个应用提交后,负责与NodeManager交互,分配Container并加载ApplicationMaster,也负责终止或销毁

YarnScheduler: 资源调度分配, 有FIFO(with Priority),Fair,Capacity方式

ContainerAllocationExpirer: 管理已分配但没有启用的Container,超过一定时间则将其回收

YARN - NodeManager

  • Node节点下的Container管理

启动时向ResourceManager注册并定时发送心跳消息,等待ResourceManager的指令
监控Container的运行,维护Container的生命周期,监控Container的资源使用情况
启动或停止Container,管理任务运行时的依赖包(根据ApplicationMaster的需要,启动Container之前将需要的程序及其依赖包、配置文件等拷贝到本地)

  • 内部结构
    在这里插入图片描述
    NodeStatusUpdater: 启动向ResourceManager注册,报告该节点的可用资源情况,通信的端口和后续状态的维护

ContainerManager: 接收RPC请求(启动、停止),资源本地化(下载应用需要的资源到本地,根据需要共享这些资源)

PUBLIC: /filecache

PRIVATE: /usercache//filecache

APPLICATION: /usercache//appcache//(在程序完成后会被删除)

ContainersLauncher: 加载或终止Container

ContainerMonitor: 监控Container的运行和资源使用情况

ContainerExecutor: 和底层操作系统交互,加载要运行的程序

YARN - ApplicationMaster

单个作业的资源管理和任务监控

具体功能描述:

  • 计算应用的资源需求,资源可以是静态或动态计算的,静态的一般是Client申请时就指定了,动态则需要ApplicationMaster根据应用的运行状态来决定
  • 根据数据来申请对应位置的资源(Data Locality)
  • 向ResourceManager申请资源,与NodeManager交互进行程序的运行和监控,监控申请的资源的使用情况,监控作业进度
  • 跟踪任务状态和进度,定时向ResourceManager发送心跳消息,报告资源的使用情况和应用的进度信息
  • 负责本作业内的任务的容错

ApplicationMaster可以是用任何语言编写的程序,它和ResourceManager和NodeManager之间是通过ProtocolBuf交互,以前是一个全局的JobTracker负责的,现在每个作业都一个,可伸缩性更强,至少不会因为作业太多,造成JobTracker瓶颈。同时将作业的逻辑放到一个独立的ApplicationMaster中,使得灵活性更加高,每个作业都可以有自己的处理方式,不用绑定到MapReduce的处理模式上

如何计算资源需求

一般的MapReduce是根据block数量来定Map和Reduce的计算数量,然后一般的Map或Reduce就占用一个Container

如何发现数据的本地化

数据本地化是通过HDFS的block分片信息获取的

YARN - Container

基本的资源单位(CPU、内存等)
Container可以加载任意程序,而且不限于Java
一个Node可以包含多个Container,也可以是一个大的Container
ApplicationMaster可以根据需要,动态申请和释放Container

YARN - Failover

失败类型

  • 程序问题
  • 进程崩溃
  • 硬件问题

失败处理

任务失败

  • 运行时异常或者JVM退出都会报告给ApplicationMaster
  • 通过心跳来检查挂住的任务(timeout),会检查多次(可配置)才判断该任务是否失效
  • 一个作业的任务失败率超过配置,则认为该作业失败
  • 失败的任务或作业都会有ApplicationMaster重新运行

ApplicationMaster失败
ApplicationMaster定时发送心跳信号到ResourceManager,通常一旦ApplicationMaster失败,则认为失败,但也可以通过配置多次后才失败

一旦ApplicationMaster失败,ResourceManager会启动一个新的ApplicationMaster
新的ApplicationMaster负责恢复之前错误的ApplicationMaster的状态(yarn.app.mapreduce.am.job.recovery.enable=true),这一步是通过将应用运行状态保存到共享的存储上来实现的,ResourceManager不会负责任务状态的保存和恢复

Client也会定时向ApplicationMaster查询进度和状态,一旦发现其失败,则向ResouceManager询问新的ApplicationMaster

NodeManager失败
NodeManager定时发送心跳到ResourceManager,如果超过一段时间没有收到心跳消息,ResourceManager就会将其移除

任何运行在该NodeManager上的任务和ApplicationMaster都会在其他NodeManager上进行恢复

如果某个NodeManager失败的次数太多,ApplicationMaster会将其加入黑名单(ResourceManager没有),任务调度时不在其上运行任务

ResourceManager失败
通过checkpoint机制,定时将其状态保存到磁盘,然后失败的时候,重新运行

通过zookeeper同步状态和实现透明的HA

可以看出,一般的错误处理都是由当前模块的父模块进行监控(心跳)和恢复。而最顶端的模块则通过定时保存、同步状态和zookeeper来ֹ实现HA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章