文章目录
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。
Yarn的作用
- 对集群资源进行整合,让我们资源得到最大化利用,同一套硬件资源集群上可以运行多个任务(mr,spark, flink)。
- 使得不同性能的机器的工作能够协调统一;
Yarn基本架构
YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。
在Hadoop1.0中很重要的角色是jobtracker,这是主,承担着资源调度和任务管理的角色,相当于集两大功能于一身,真正干活的是tasktracker。
在Hadoop2.0中,jobtracker的权利被下放给ResourceManager(集群资源管理)和ApplocationMaster(任务管理)。
RM
只是jobtracker中“资源管理”的角色,只负责运行中应用程序资源的分配,而不管监控应用程序和状态跟踪。
本质
:是一个独立的守护进程,运行在专有的机器上,机器的配置要足够好
RM的功能
- RM处理客户端请求,接收jobsubmitterf提交的作业,按照作业的上下文( Context)信息,以及从 Nodemanager(NM)收集来的状态信息,启动调度过程,分配一个 Container作为 App Master;
- RM拥有为系统中所有应用资源分配的決定权,是中心服务,做的事情就是调度,启动每一个job所属的 Application、另外监控 Applicationg的存在情况am
- 与运行在每个节点上的NM进程交互,通过心跳通信,达到监控NM的目的
- RM有一个可插拔的调度器组件 Scheduler
- 不负责应用程序的监控和状态跟踪(AM)
- 不保证应用程序失败或者硬件失败的情况下对Task的重启(AM)
AM
只是jobtracker中“任务调度”的角色 。只有在任务的整个生命周期内,AM才是启动状态,当任务执行完毕,AM消失,不需要监控。
本质
:是一个特殊的container,管理其他的container
AM的作用
根据提交的任务和RM的反馈,去寻找干活的人(NodeManager)。
AM的启动流程
-
Client向RM发出请求;
-
RM返回一个 ApplicationID作为回应;
-
Clientl向RM回应 Application Submission Context(ASC)。ASC包括 Applicationid、user、 queue,以及其他一些启动AM相关的信息,除此之外,还有一个 Container Launch Context(CLC),CLC包含了资源请求数(内存与CPU), job files,安全 token,以及其他些用以在一个node上启动AM的信息。任务一旦提交以后, clients可以请求RM去杀死应用或查询应用的运行状态;
-
当RM接受到ASC后,它会调度一个合适的Node Manager,来启动一个container(这个 containe经常被称作为 container0)并运行Application Master实例。如果没有合适的 container,AM就不能启动。当有合适的 container时,RM发请求到合适的NM上,来启动AM。这时候,AM的PRC与监控的URL就已经建立了;
-
当AM启动起来后,RM回应给AM集群的最小与最大资源等信息。这时AM必须決定如何使用当前可用的资源。YARN不像那些请求固定资源的 scheduler,它能够根据集群的当前状态动态调整;
-
AM根据从RM那里得知的可使用的资源,它会请求一些一定数目的 container;
-
RM将会根据调度策略,尽可能的满足AM申请的 container。AM获取到container资源执行分布式计算任务,并监控和管理作业状态。当任务完成之后,AM会通知RM释放 container资源。
NM
相当于是tasktracker,这里NM和RM通过心跳进行通讯。
NM的作用
-
是 slave进程,类似 Tasktracker的角色,是每个机器框架代理;
-
处理来自RM的任务请求;
-
接收并处理来自 Applicationmaster的 Container启动、停止等各种请求;
-
负责启动应用程序的 container(执行应用程序的容器),并监控他们的资源使用情況(CPU、内存、磁盘和网络),并报告给RM;
-
总的来说,在单节点上进行资源管理和任务管理;
Container
容器( Container)这个东西是Yarn对资源做的一层抽象。就像我们平时开发过程中,经常需要对底层一些东西进行封装,只提供给上层一个调用接口一样,Yarn对资源的管理也是用到了这种思想。
Container作用
- Yarn将CPU核数,内存这些计算资源都封装成为一个个的容器;
- 是任务运行环境的抽象封装(8,16G) container(1cpu,2G) container(1cpu,6G);
- Container只是使用NM上指定资源的权利;
- AM必须向NM提供更多的信息来启动 Container;
- 描述任务的运行资源(内存、cpu)、启动命令run.Sh和运行环境;
- 正真运行任务的地方;
Slot VS Container
Slot
hadoop1.0中slot就是资源,map有map slot, reduce有reduce slot,二者资源不是通用的。
案例
slot理解为小区的停车位(分普通小轿车,大型卡车),两者车位大小不一样,如果卡车车位有空闲,小轿车也是不能停的。同理卡车也一样,不能占用小轿车车位;
slot决定cpu和内存的大小
假设:1个slot代表2G内存和1个cpu
- 一个任务只需要1G内存和1个cpu,会出现资源碎片,导致资源利用率偏低,产生闲置资源;
- 一个任务需要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数量
总结
- RM和AM本质上就是对jobtracker进行绝对权力的肢解
- AM是一个任务的主
- NM是节点的主
- 1.0 mapreduce -> job
- 2.0 mapreduce -> application
Yarn工作机制
- MR 程序提交到客户端所在的节点。
- YarnRunner 向ResourceManager 申请一个 Application。
- RM 将该应用程序的资源路径返回给 YarnRunner。
- 该程序将运行所需资源提交到HDFS 上。
- 程序资源提交完毕后,申请运行 mrAppMaster。
- RM 将用户的请求初始化成一个 Task。
- 其中一个NodeManager 领取到Task 任务。
- 该NodeManager 创建容器Container,并产生MRAppmaster。
- Container 从HDFS 上拷贝资源到本地。
- MRAppmaster 向RM 申请运行MapTask 资源。
- RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个NodeManager 分别领取任务并创建容器。
- MR 向两个接收到任务的NodeManager 发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask 对数据分区排序。
- MrAppMaster 等待所有MapTask 运行完毕后,向RM 申请容器,运行ReduceTask。
- ReduceTask 向 MapTask 获取相应分区的数据。
- 程序运行完毕后,MR 会向RM 申请注销自己。
Yarn作业提交过程
作业提交
- 第1 步:Client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。
- 第2 步:Client 向 RM 申请一个作业id。
- 第3 步:RM 给 Client 返回该job 资源的提交路径和作业 id。
- 第4 步:Client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
- 第5 步:Client 提交完资源后,向RM 申请运行 MrAppMaster。
作业初始化
- 第6 步:当RM 收到Client 的请求后,将该 job 添加到容量调度器中。
- 第7 步:某一个空闲的NM 领取到该Job。
- 第8 步:该NM 创建Container,并产生MRAppmaster。
- 第9 步:下载Client 提交的资源到本地。
任务分配
- 第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 中的任务将其进度和状态(包括 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
,更多精彩内容等您来发现~