Yarn 工做架构html
最近随着集群你们开始频繁使用集群,资源调度的问题愈加的凸显出来。须要更加深刻的了解 yarn 资源调度的原理,以及到底在背后作了一些什么事情。node
来看一下下面这张图。linux
yarn 里面有两个大的角色,这个也很容易在 yarn 里面的配置看到。算法
一个是 Resource Manager 相似于 Master 角色负责任务分配,他会往 Node Manager 分配一个 App Master。 而后 App Master 会向 Resource Manager 申请资源。这个时候 Resource Manager 会给这个任务开始分配 Container 用于实际处理这个任务。架构
这里咱们能够仔细看下这张图。app
这里左边来了两个须要计算调度的任务。咱们能够认为一个是 hive 表的 sqoop 同步任务,另一个是 hive 的 mapreduce 查询任务。分布式
Client 到 Resource Manager 这里的线表明的是 Job Submission 任务提交。以后 ResourceMnagager 会为任务分配 Application Master。ide
这个 Application Master 就是该任务的代理。 Application Master 会直接经过 Resource Request 向 ResourceManager 进行状态汇报。 同时全部被 Application Master 分配的 Container 都会定时向 Application Master 上报 MapReduce Status 也就是任务的运行状态。同时 Container 也会向 NodeManager 汇报。oop
下面咱们来看下在 Resource Manager 里面包含了什么ui
图上的 1a 是负责任务调度。1b 是维护当前的任务的,好比当前提交的那些活儿。1c 是一个 rpc 服务,所作的工做就是响应 Node Manager.
正好我看的这个介绍的视频穿插介绍了 spark on yarn cluster 的架构,顺手贴个图吧.
CDH 静态动态资源分配
下面让咱们来梳理一下 Yarn 资源调度的几种模式
1. FIFO Scheduler 先到先得 谁先提交,先就优先得到更多的资源执行。
2. Capacity Scheduler 容器管理
3. Fair Scheduler 公平调度管理 前提:假设任务具备相同的优先级,平均分配资源。能够指定任务权重,权重任务大的能够得到更多的资源。之内存为资源分配条件。
4. DRF 主导资源公平 和 Fair Scheduler 相比该资源调度将会在考虑内存的同时也考虑 CPU 需求做为调度的条件。
一般默认 CDH 会设置 DRF 做为默认的调度器。
因为担忧 CDH 和 社区版的会有不一样下面一部份内容将重点参考 CDH 官方文档。
咱们先从最上层谈起
CDH 的 CM 提供了两种方法去分配集群资源给各个服务,分别是静态分配和动态分配。
静态资源分配使用了 linux 内核提供的 cgroups ,使用cgroups静态分配资源能够经过单个静态服务池向导进行配置。您能够按总资源的百分比分配服务,向导将配置cgroups。
另一种分配是动态资源分配。
动态资源池分配资源在 CM 里面支持对 YARN 和 Impala 进行配置。
咱们能够经过设置动态资源池来限制一些资源的使用。我看了一下文档感受这一部分须要高亮的地方能够提一下。
A scheduling rule defines when a configuration set is active. The configurations in the configuration set are propagated to the fair scheduler allocation file as required by the schedule. The updated files are stored in the YARN ResourceManager configuration directory /var/run/cloudera-scm-agent/process/nn-yarn-RESOURCEMANAGER on the host running the ResourceManager role. See Server and Client Configuration.
1. 配置的修改会保存在 yarn 的 ResourceManager 部署节点的 /var/run/cloudera-scm-agent/process/nn-yarn-RESOURCEMANAGER 目录下。咱们能够经过 ls -lst 找到最新配置。
2. 咱们能够配置资源池为父池,可是一旦被配置为父池子就不能挂具体执行的任务了。具体的任务只能挂在子池子上。子池子上的资源策略要小于等于父池子的策略。若是超过的话以父池为准。
下面我配置了一个动态资源池给咱们一个 spark 常驻服务使用。
其实看上去很简单。
我这里要解决的需求就是单独隔离这一类任务,只须要设置这个池子,而后若是须要进行更精细的资源控制,只须要将这个池子设置成父池子,再设置相应的子池子就行了。
并且移动已经在执行任务的队列方法也很是方便只须要使用命令
hadoop2.0及以上版本能够经过下面命令 yarn application -movetoqueue application_1478676388082_963529 -queue root.etl
Steady Fair | ShareInstantaneous Fair Share 的区别
Yarn中的steady fair share值和Instaneous Fair Share值都表明了当前分配给这个队列的最大资源值,也是队列在任什么时候候资源使用量不能够超过的值 ,可是他们存在区别。
对于steady fair share,是一个静态值,是Yarn根据每一个队列的minShare、maxShare和weight的配置计算获得的理论上应该分配给这个队列的最大资源,它与这个队列当前是否有app正在运行无关,只和咱们在fair-scheduler.xml中的配置有关。
而Instaneous fair share则不一样,它是根据当前集群中队列的运行状态的变化而实时变化的,即,若是一个队列上没有任何一个app在运行,即这个队列是inactive队列,那么,这个队列的instaneous fair share值是0,剩余的active队列会对集群资源进行瓜分,显然,若是集群中有队列从active变为inactive,那么剩余这些队列瓜分到的instaneous fair shared都会随之变大,反之,若是有一个队列从inactive变为active,则剩余每一个队列的instaneous fair share会随之变小,即instaneous fair share会变小。
参数介绍
最后我想以 yarn ui 界面上的一些参数解释来结束这篇文章
正常咱们会看到本身执行的任务在 yarn 的管理界面长这个样子。
Queue: 表明正在哪一个队列里面执行,若是是 CDH 的动态资源分配模式下会对应一个资源池的概念。
% of Queue: 占资源池里面多少资源百分比。
% of Cluster: 占整个集群资源的百分比。
schema 的界面会是这个样子
FairShare: 表明最多能够占用的内存数量。
更多的细节就要看代码了,好比各类个样的调度器算法。本篇文章不会这么深刻,不过以后有机会也会看一看。
---------------------------------参数调优----------------------------------
yarn.nodemanager.resource.memory-mb 调整每台物理机器能够被调度的内存资源 好比四个节点就会是 * 4 yarn.scheduler.maximum-allocation-mb 调整单个任务能够分配的最大内存资源。通常这个 cloudera 推荐调整为最大配置机器的可分配内存数 yarn.nodemanager.resource.cpu-vcores 调整每台物理机器能够被调度的 cpu 资源 好比四个节点就会是 * 4
更详细的资源方面的调优建议参考
https://wiki.jrwang.me/cluster/cluster-yarn-conf.html
Reference:
https://www.youtube.com/watch?v=_QkKw82ge6g Hadoop内部原理:分布式系统如何实现?存储、计算和调度
https://www.cloudera.com/documentation/enterprise/6/6.0/topics/admin_rm.html Resource Management
https://blog.csdn.net/wisgood/article/details/39075883 Hadoop 设置任务执行的队列以及优先级
https://note.youdao.com/share/?id=76b79bced3fcd4aec4327c8a20032ca7&type=note#/ wjh 的有道云笔记
https://blog.csdn.net/qq_35440040/article/details/82620794 Yarn FairSheduler使用FairSharePolicy计算Fair Share的规则、原理和代码实现
http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-memory-cpu-scheduling/ Hadoop YARN中内存和CPU资源的调度和隔离