Yarn入门
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度
yarn 并不清楚用户提交的程序的运行机制
yarn 只提供运算资源的调度(用户程序向 yarn 申请资源,yarn 就负责分配资源)
yarn 中的主管角色叫 ResourceManager
yarn 中具体提供运算资源的角色叫 NodeManager
yarn与运行的用户程序完全解耦,意味着yarn上可以运行各种类型的分布式运算程序,
比如 mapreduce、storm,spark,tez ……
spark、storm 等运算框架都可以整合在 yarn 上运行,只要他们各自的框架中有符合
yarn 规范的资源请求机制即可
yarn 成为一个通用的资源调度平台.企业中以前存在的各种运算集群都可以整合在一
个物理集群上,提高资源利用率,方便数据共享
Yarn三大组件
- ResourceManager 负责所有资源的监控、分配和管理
- ApplicationMaster 负责每一个具体应用程序的调度和协调
- NodeManager 负责每一个节点的维护
ResourceManager
- RM负责整个集群的资源管理和分配,是一个全局的资源管理系统
- NM以心跳的方式向 RM汇报资源使用情况(目前主要是 CPU 和内存的使用情况)
- RM只接收请求, 不对具体资源进行处理
NodeManager
- NM是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控
- NM定时向 RM汇报本节点资源(CPU、内存)的使用情况和Container 的运行状态
- NM接收并处理来自 ApplicationMaster 的 Container 启动、停止等各种请求
ApplicationMaster
- 用户提交的每个应用程序均包含一个ApplicationMaster
- 负责与 RM 调度器协商以获取资源(用 Container 表示)
- 将得到的任务进一步分配给内部的任务(MapTask ReduceTask)
- 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务
Yarn 运行流程
- 客户端请求RM获得资源(continer)运行AM
- AM启动后, 与RM保持联系, 并申请continer运行task
- RM返回continer后, AM要求NM启动continer, 并与NM保持通信, 对运行的task进行监控和管理
- 应用运行期间,client 直接与 AM 通信获取应用的状态、进度更新等信息。
- 应用运行结束后,ApplicationMaster 向 ResourceManager 注销自己,并允许属于它的continer被收回
Yarn调度器Scheduler
理想情况下,我们应用对 Yarn 资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。
在Yarn 中,负责给应用分配资源的就是 Scheduler。
在 Yarn 中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairScheduler。默认采用 Capacity Scheduler
FIFO Scheduler
- FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源
- 会导致其他应用阻塞
Capacity Scheduler
- Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。
- 每个组织内采用FIFO
Capacity 调度器 配置使用 capacity-scheduler.xml 配置 root prod 40% dev 60% max:75% mapreduce 60%*50% spark 60%*50% <configuration> <!-- root下 有两个队列 prod和dev--> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod,dev</value> </property> <!-- dev 有两个队列 mapreduce和spark--> <property> <name>yarn.scheduler.capacity.root.dev.queues</name> <value>mapreduce,spark</value> </property> <!-- prod正常情况下占用40%--> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>40</value> </property> <!-- dev正常情况下占用60%--> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>60</value> </property> <!-- 即使prod时空闲的, dev最多占用75%, 留25%给prod应急用 --> <property> <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name> <value>75</value> </property> <!--mapreduce占用dev的50% --> <property> <name>yarn.scheduler.capacity.root.dev.mapreduce.capacity</name> <value>50</value> </property> <!--spark占用dev的50% --> <property> <name>yarn.scheduler.capacity.root.dev.spark.capacity</name> <value>50</value> </property> </configuration>
在 MapReduce 中,我们可以通过mapreduce.job.queuename 属性指定要用的队列。如果队列不存在,我们在提交任务时就会收到错误。如果我们没有定义任何队列,所有的应用将会放在一个 default 队列中。
对于 Capacity 调度器,我们的队列名必须是队列树中的最后一部分(prod mapreduce spark),如果我们使用队列树则不会被识别。
Fair Scheduler
- 在 Fair 调度器中,我们不需要预先占用一定的系统资源,Fair 调度器会为所有运行的job 动态的调整系统资源。
- 当第一个大 job 提交时,只有这一个 job 在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair 调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。