大数据资源调度架构–Yarn

  • Post author:
  • Post category:其他


Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。

image-20210208165510931



Yarn的作用

  1. 对集群资源进行整合,让我们资源得到最大化利用,同一套硬件资源集群上可以运行多个任务(mr,spark, flink)。
  2. 使得不同性能的机器的工作能够协调统一;



Yarn基本架构

YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。

image-20210208165736589

在Hadoop1.0中很重要的角色是jobtracker,这是主,承担着资源调度和任务管理的角色,相当于集两大功能于一身,真正干活的是tasktracker。

在Hadoop2.0中,jobtracker的权利被下放给ResourceManager(集群资源管理)和ApplocationMaster(任务管理)。



RM

只是jobtracker中“资源管理”的角色,只负责运行中应用程序资源的分配,而不管监控应用程序和状态跟踪。


本质

:是一个独立的守护进程,运行在专有的机器上,机器的配置要足够好



RM的功能

  1. RM处理客户端请求,接收jobsubmitterf提交的作业,按照作业的上下文( Context)信息,以及从 Nodemanager(NM)收集来的状态信息,启动调度过程,分配一个 Container作为 App Master;
  2. RM拥有为系统中所有应用资源分配的決定权,是中心服务,做的事情就是调度,启动每一个job所属的 Application、另外监控 Applicationg的存在情况am
  3. 与运行在每个节点上的NM进程交互,通过心跳通信,达到监控NM的目的
  4. RM有一个可插拔的调度器组件 Scheduler
  5. 不负责应用程序的监控和状态跟踪(AM)
  6. 不保证应用程序失败或者硬件失败的情况下对Task的重启(AM)



AM

只是jobtracker中“任务调度”的角色 。只有在任务的整个生命周期内,AM才是启动状态,当任务执行完毕,AM消失,不需要监控。


本质

:是一个特殊的container,管理其他的container



AM的作用

根据提交的任务和RM的反馈,去寻找干活的人(NodeManager)。



AM的启动流程

  1. Client向RM发出请求;

  2. RM返回一个 ApplicationID作为回应;

  3. Clientl向RM回应 Application Submission Context(ASC)。ASC包括 Applicationid、user、 queue,以及其他一些启动AM相关的信息,除此之外,还有一个 Container Launch Context(CLC),CLC包含了资源请求数(内存与CPU), job files,安全 token,以及其他些用以在一个node上启动AM的信息。任务一旦提交以后, clients可以请求RM去杀死应用或查询应用的运行状态;

  4. 当RM接受到ASC后,它会调度一个合适的Node Manager,来启动一个container(这个 containe经常被称作为 container0)并运行Application Master实例。如果没有合适的 container,AM就不能启动。当有合适的 container时,RM发请求到合适的NM上,来启动AM。这时候,AM的PRC与监控的URL就已经建立了;

  5. 当AM启动起来后,RM回应给AM集群的最小与最大资源等信息。这时AM必须決定如何使用当前可用的资源。YARN不像那些请求固定资源的 scheduler,它能够根据集群的当前状态动态调整;

  6. AM根据从RM那里得知的可使用的资源,它会请求一些一定数目的 container;

  7. RM将会根据调度策略,尽可能的满足AM申请的 container。AM获取到container资源执行分布式计算任务,并监控和管理作业状态。当任务完成之后,AM会通知RM释放 container资源。



NM

相当于是tasktracker,这里NM和RM通过心跳进行通讯。



NM的作用

  1. 是 slave进程,类似 Tasktracker的角色,是每个机器框架代理;

  2. 处理来自RM的任务请求;

  3. 接收并处理来自 Applicationmaster的 Container启动、停止等各种请求;

  4. 负责启动应用程序的 container(执行应用程序的容器),并监控他们的资源使用情況(CPU、内存、磁盘和网络),并报告给RM;

  5. 总的来说,在单节点上进行资源管理和任务管理;



Container

容器( Container)这个东西是Yarn对资源做的一层抽象。就像我们平时开发过程中,经常需要对底层一些东西进行封装,只提供给上层一个调用接口一样,Yarn对资源的管理也是用到了这种思想。

image-20210208172109238



Container作用

  1. Yarn将CPU核数,内存这些计算资源都封装成为一个个的容器;
  2. 是任务运行环境的抽象封装(8,16G) container(1cpu,2G) container(1cpu,6G);
  3. Container只是使用NM上指定资源的权利;
  4. AM必须向NM提供更多的信息来启动 Container;
  5. 描述任务的运行资源(内存、cpu)、启动命令run.Sh和运行环境;
  6. 正真运行任务的地方;



Slot VS Container



Slot

hadoop1.0中slot就是资源,map有map slot, reduce有reduce slot,二者资源不是通用的。


案例

slot理解为小区的停车位(分普通小轿车,大型卡车),两者车位大小不一样,如果卡车车位有空闲,小轿车也是不能停的。同理卡车也一样,不能占用小轿车车位;


slot决定cpu和内存的大小

假设:1个slot代表2G内存和1个cpu

  1. 一个任务只需要1G内存和1个cpu,会出现资源碎片,导致资源利用率偏低,产生闲置资源;
  2. 一个任务需要3G内存,会抢占其他任务资源,导致集群利用率过高

1个节点(机器),16个cpu,32g内存,在机器上配置了4个slot,相当于一个slot等于4个cpu、8g内存(等量划分,将资源进行完全平均化);



container

hadoop2.0中没有slot,取而代之的是container(类似于拼图,自由组装)


container个数计算公式

container数量 = min(2

cores, 1.8

disk, 总内存/最小容量)

  • cores代表cpu个数
  • disks:磁盘的规模
  • 因此对最小容量进行参数配置,达到控制container数量



总结

  1. RM和AM本质上就是对jobtracker进行绝对权力的肢解
  2. AM是一个任务的主
  3. NM是节点的主
  4. 1.0 mapreduce -> job
  5. 2.0 mapreduce -> application



Yarn工作机制

image-20210208173053731

  1. MR 程序提交到客户端所在的节点。
  2. YarnRunner 向ResourceManager 申请一个 Application。
  3. RM 将该应用程序的资源路径返回给 YarnRunner。
  4. 该程序将运行所需资源提交到HDFS 上。
  5. 程序资源提交完毕后,申请运行 mrAppMaster。
  6. RM 将用户的请求初始化成一个 Task。
  7. 其中一个NodeManager 领取到Task 任务。
  8. 该NodeManager 创建容器Container,并产生MRAppmaster。
  9. Container 从HDFS 上拷贝资源到本地。
  10. MRAppmaster 向RM 申请运行MapTask 资源。
  11. RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个NodeManager 分别领取任务并创建容器。
  12. MR 向两个接收到任务的NodeManager 发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask 对数据分区排序。
  13. MrAppMaster 等待所有MapTask 运行完毕后,向RM 申请容器,运行ReduceTask。
  14. ReduceTask 向 MapTask 获取相应分区的数据。
  15. 程序运行完毕后,MR 会向RM 申请注销自己。



Yarn作业提交过程

image-20210208173831359



作业提交

  1. 第1 步:Client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。
  2. 第2 步:Client 向 RM 申请一个作业id。
  3. 第3 步:RM 给 Client 返回该job 资源的提交路径和作业 id。
  4. 第4 步:Client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
  5. 第5 步:Client 提交完资源后,向RM 申请运行 MrAppMaster。



作业初始化

  1. 第6 步:当RM 收到Client 的请求后,将该 job 添加到容量调度器中。
  2. 第7 步:某一个空闲的NM 领取到该Job。
  3. 第8 步:该NM 创建Container,并产生MRAppmaster。
  4. 第9 步:下载Client 提交的资源到本地。



任务分配

  1. 第10 步:MrAppMaster 向RM 申请运行多个 MapTask 任务资源。
  2. 第11 步:RM 将运行 MapTask 任务分配给另外两个NodeManager,另两个 NodeManager分别领取任务并创建容器。



任务运行

  1. 第 12 步:MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个NodeManager 分别启动 MapTask,MapTask 对数据分区排序。
  2. 第13步:MrAppMaster 等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
  3. 第14 步:ReduceTask 向MapTask 获取相应分区的数据。
  4. 第15 步:程序运行完毕后,MR 会向RM 申请注销自己。



进度和状态更新

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



作业完成

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



Yarn容错能力

  • 任务失败

    • 任务VM会在退出之前向父 applicationmaster发送错误报告,记入用户日志,并释放容器以便资源可以为其他任务使用。 applicationmaster会尝试在其他节点重新调度执行任务,默认4次
  • RM挂掉

    • 单点故障,新版本可以基于 Zookeeper实现HA高可用集群,可通过配置进行设置准备RM,主提供服务,备同步主的信息,一旦主挂掉,备立即做切换接替进行服务
  • NM挂掉

    • 普通情况下,NM不止一个,当一个挂了,会通过心跳方式通知RM,RM将情况通知对应AM,AM作进一步处理(将原来这个机器上启动的任务交给另外节点接管
    • 如果该nm上有am,整个任务挂掉了
    • 如果该nm上没有am,整个任务不会挂掉
  • AM挂掉

    • AM挂掉:若挂掉,RM负责重启,其实RM上有一个 Rmapplication Master是AM的AM,上面保存已经完成的task,若重启AM,无需重新运行已经完成的

本篇文章到此结束,希望对大家有所帮助,大家可以访问我的

Blog

,更多精彩内容等您来发现~



版权声明:本文为weixin_45604606原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。