Yarn 工作架构

最近随着集群大家开始频繁使用集群,资源调度的问题越发的凸显出来。需要更加深入的了解 yarn 资源调度的原理,以及到底在背后做了一些什么事情。

来看一下下面这张图。

yarn 里面有两个大的角色,这个也很容易在 yarn 里面的配置看到。

一个是 Resource Manager 类似于 Master 角色负责任务分配,他会往 Node Manager 分配一个 App Master。 然后 App Master 会向 Resource Manager 申请资源。这个时候 Resource Manager 会给这个任务开始分配 Container 用于实际处理这个任务。

这里我们可以仔细看下这张图。

这里左边来了两个需要计算调度的任务。我们可以认为一个是 hive 表的 sqoop 同步任务,另外一个是 hive 的 mapreduce 查询任务。

Client 到 Resource Manager 这里的线代表的是 Job Submission 任务提交。之后 ResourceMnagager 会为任务分配 Application Master。

这个 Application Master 就是该任务的代理。 Application Master 会直接通过 Resource Request 向 ResourceManager 进行状态汇报。 同时所有被 Application Master 分配的 Container 都会定时向 Application Master 上报 MapReduce Status 也就是任务的运行状态。同时 Container 也会向 NodeManager 汇报。

下面我们来看下在 Resource Manager 里面包含了什么

图上的 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       调整每台物理机器可以被调度的内存资源 比如四个节点就会是 * 

yarn.scheduler.maximum-allocation-mb      调整单个任务可以分配的最大内存资源。一般这个 cloudera 推荐调整为最大配置机器的可分配内存数

yarn.nodemanager.resource.cpu-vcores      调整每台物理机器可以被调度的 cpu 资源 比如四个节点就会是 * 

更详细的资源方面的调优建议参考

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资源的调度和隔离

CDH Yarn 调度资源指南 - CDH6.0.x 详解的更多相关文章

  1. C++11 并发指南六( <atomic> 类型详解二 std::atomic )

    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)  一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...

  2. C++11 并发指南五(std::condition_variable 详解)(转)

    前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...

  3. 【转】C++11 并发指南五(std::condition_variable 详解)

    http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...

  4. 【C/C++开发】C++11 并发指南三(std::mutex 详解)

    本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...

  5. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

  6. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

  7. C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

  8. C++11 并发指南五(std::condition_variable 详解)

    前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...

  9. [转载]AxureRP 7.0部件详解(一)

    本文为Axure RT7.0教程,本章主要介绍menu菜单.table表格.Tree Widget 树部件三个部件,后续将持续更新...... Menu 菜单 常用案例 网站导航菜单部件通常用于母板之 ...

随机推荐

  1. Spring Boot admin 2.0 详解

    一.什么是Spring Boot Admin ? Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序. 应用程序作为Spring Boot Admin C ...

  2. 关于git的简单操作

    首先这篇随笔我是不太想写的,因为网上有很多教程,我也是看廖雪峰大神的git教程自学的.还是一个小学生,就当一个学习笔记了,如果你想看大神的原版,请点击这里.我们原来都是用svn的,但是越来越觉得svn ...

  3. https处理的一个过程,对称加密和非对称加密

    一,对称加密 所谓对称加密,就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的过程如下: 发送端和接收端首先要共享相同的密钥k(即通信前双方都需要知道对应的密 ...

  4. 一句话总结kNN算法

    一句话总结kNN算法 核心:模板匹配,将样本分到离它最相似的样本所属的类. kNN算法本质上使用了模板匹配的思想.要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本 ...

  5. Flutter数据持久化入门以及与Web开发的对比

    对于大部分安卓或者IOS开发人员来说,App的数据持久化可能是很平常的一个话题.但是对于Web开发人员来说,可能紧紧意味着localStorage和sessionStorage. Web开发 loca ...

  6. SpringBoot 配置 跨域支持

    跨域资源共享(CORS,请求协议,请求地址,请求端口三者必须相同才是同一服务器,否则都要进行跨域操作)标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源.另外,规范要求,对那 ...

  7. JVM内存管理 《深入分析java web 技术内幕》第八章

    8.1 物理内存与虚拟内存 物理内存RAM(随机存储器),寄存单元为寄存器,用于存储计算单元执行指令的中间结果. 连接处理器和RAM或者处理器和寄存器的是地址总线,这个地址的宽度影响了物理地址的索引范 ...

  8. bootstrap-treeview 在 bootstrap 4 不兼容解决办法及使用

    bootstrap-treeview 是bootstrap的一个树形插件,插件依赖: bootstrap/3.3.7 jquery/3.3.1 经过验证,它不可以在 bootstrap 高于 3.3. ...

  9. 关于 MongoDB 与 SQL Server 通过本身自带工具实现数据快速迁移 及 注意事项 的探究

    背景介绍 随着业务的发展.需求的变化,促使我们追求使用不同类型的数据库,充分发挥其各自特性.如果决定采用新类型的数据库,就需要将既有的数据迁移到新的数据库中.在这类需求中,将SQL Server中的数 ...

  10. cannot be run because the QueueReader subsystem failed to load

    前阵子一数据库服务器的事务日志开始暴增,当时使用下面脚本检查发现该数据库的log_reuse_wait_desc 一直处于REPLICATION状态, 也就是说在事务复制过程中,与发布相关的事务仍未传 ...