资源调度框架 - Yarn

资源调度框架 - Yarn

1. yarn介绍

​ Apache Hadoop Yarn是Hadoop 2.0为了分离资源管理计算组件而引入的,yarn的诞生源于存储在HDFS的数据需要更多的交互模式,能提供更多的处理框架,而不单单是MR模式。

​ 在市面上,有很多基于yarn的云产品应用。当企业的数据在HDFS中是可用的,有多重数据处理方式是很重要的,有了hadoop 2.0和yarn,机构可以采用流处理,互动数据处理方式以及其他的基于Hadoop的应用程序。

2. yarn架构

​ yarn的架构还是经典的主从(master/slave)结构,和hadoop的架构一样,大体上看,yarn服务由一个ResourceManager(RM)和多个NodeManager(NM)构成,ResourceManager为主节点,NodeManager为从节点。

核心组件

组件名作用
ResourceManager是Master上一个独立运行的进程,负责集群统一的资源管理,调度,分配等
ApplicationMaster相当于某个Application应用的监护人和管理者,和NodeManager协同工作来运行应用的各个任务,同时负责向Yarn的ResourceManager申请资源,返还资源等。
NodeManager是Slave从节点上一个独立运行的进程,负责上报节点的状态,资源(磁盘,内存,cpu)等使用情况。
Container是yarn中分配资源的一个单位,包含内存,cpu等重要资源,yarn以Container为单位分配资源。

Client向ResourceManager提交的每一个应用程序都必须有一个ApplicationMaster,它经过ResourceManager分配资源后,运行于某一个Slave节点的Container中。

2.1 ResourceManager

​ RM是一个全局的资源管理器,集群只有一个,负责整个系统的资源调度管理和分配,包括处理客户端请求,启动/监控ApplicationMaster,监控NodeManager,资源的分配与调度。它主要由两个组件构成:Schedule调度器ApplicationManager应用程序管理器

(1)调度器根据容量,队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。调度器根据应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”Container来表示,Container是一个动态资源分配单位,它将内存,磁盘,网络等资源封装在一起,从而限定每个任务使用的资源量。

(2)应用程序管理器ApplicationManager主要负责管理整个系统中所有应用程序,接受job的提交请求,为应用分配一个Container来运行ApplicationMaster并管理。

2.2 ApplicationMaster

ApplicationMaster管理YARN内运行的应用程序的每个实例, 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用 (CPU、内存,IO等的资源分配)。

​ 功能:

  • 数据切分
  • 为应用程序申请资源并进一步分配给内部任务。
  • 任务监控与容错

Yarn的动态性,就是指多个Application的ApplicationMaster动态地和ResourceManager进行沟通,不断地申请资源,释放,再申请,再释放资源的过程。

2.3NodeManager

​ 整个集群有多个NodeManager,负责每个节点上的资源和使用。NodeManager负责接受ResourceManager的资源分配请求,分配具体的Contaioner给应用,同时还负责监控并报告Contaioner使用信息给ResourceManager。

​ 具体功能:

  • 接受并处理来自ResourceManager的命令请求,分配Container给应用的某个任务;

  • 定时向RM汇报,以情报整个集群平稳运行,RM通过收集每个NodeManager报告信息来追踪整个集群的健康状态,而NodeManager负责监控自身的健康状态。

  • 处理来自ApplicationMaster的请求

  • 管理所在节点的Container生命周期和节点日志信息

  • 执行yarn上应用的一些额外的服务,比如mapReduce shuffle过程。

    当一个节点启动时,它会向RM注册并告知RM自己由多少资源可用,在运行期间,这些信息会不断被更新。

    NodeManager只负责管理自身的Container,它并不知道运行在它上面的应用信息,负责管理应用信息的是ApplicationMaster。

2.4 Container

​ Container是yarn中的一个资源抽象概念,它封装了某个节点上的多维度资源,如内存,CPU,磁盘,网络等。当ApplicationMaster向RM申请资源时,RM返回的资源便是用Container表示,每个任务分配一个Container,并且每个任务只能使用该Container描述的资源。

​ Container和集群节点关系是:一个节点会运行多个Container,每个Container不会跨节点,任何一个job或应用必须运行在一个或多个Container上。在yarn中,RM只告诉AM哪些Container可以用,实际ApplicationMaster还要跟NodeManager请求分配具体的Container。

​ 需要注意的是Container是一个动态资源划分单位,是根据应用程序的需求动态生成的,

​ 功能:

  • 对task环境的抽象
  • 描述一系列信息(因为是抽象概念)
  • 任务运行资源的集合
  • 任务运行环境。
2.5 ResourceManager和Container

​ yarn的设计目标就是允许用户的各种应用以共享,安全,多租户的形式使用整个集群,并且为了保证集群资源调度和数据访问的高效性,yarn还必须能够感知整个集群拓扑结构。

​ 一个应用先向ApplicationMaster发送一个满足自己需求的资源请求,然后ApplicationMaster把这个资源请求发送给RM的Scheduler,Scheduler再对这个请求返回分配到的资源描述Container信息。

2.6 JobHistoryServer

​ 作业历史服务,记录在yarn中调度的作业历史运行情况

​ 启动命令:

mr-jobhistory-daemon.sh start historyserver

​ 启动后就可以在jps命令中看到多了一个进程,或者在yarn UI界面点击history跳转查看map reduce执行的详细信息。

2.7 Timeline Server

​ 用来写日志服务数据,一般来写与第三方结合的日志服务数据,是对jobhistoryserver功能的有效补充。

​ 链接:http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/TimelineServer.html

3. yarn应用运行原理(重要)

​ yarn主要由以下四个实体:

​ 1.一个全局的资源管理器ResourceManager

​ 2.每个应用程序一个ApplicationMaster

​ 3.每个从节点一个NodeManager

​ 4.每个应用程序运行在NodeManager上的Container

3.1 yarn应用提交过程。(重要)

​ application在yarn中的执行过程,整个执行过程可以分为三步:

​ (1)应用程序提交

​ (2)启动应用的ApplicationMaster实例

​ (3)ApplicationMaster实例管理应用程序的执行。

具体提交过程如下:

  • 客户端应用程序向ResourceManager提交应用并请求资源来运行一个ApplicationMaster实例
  • RM中的ApplicationManager接受应用的请求,为应用分配一个Container给NodeManager,然后在NodeManager中启动ApplicationMaster实例。
  • ApplicationMaster启动后向RM注册,注册后客户端就可以查询到自己申请应用对应的ApplicationMaster的详细信息,以后可以和管理应用的ApplicationMaster直接交互。这时应用会向ApplicationMaster发送一个满足自己需求的资源请求。
  • 在后面的操作过程中,ApplicationMaster会根据resource-request协议向RM发送resource-request请求,RM中的Sechedular接受到请求后返回分配到的资源描述Container信息。
  • ApplicationMaster获取到Container信息后,分配给各个NodeManager,并通过向NodeMagager发送contaioner-launch-specification信息来启动Container。
  • 后续应用程序的代码以task形式(比如map task和reduce task)在启动的Container运行,并向ApplicationMaster报告运行进度,状态等信息。,另外客户端也可以通过ApplicationMaster得知应用的运行情况。
  • 最后应用程序运行完成后,ApplicationMaster向ResourceManager取消注册然后关闭,用到的所有Continer归还给系统。

概括:(1)用户提交应用程序给ResourceManager

​ (2)向ResourceManager申请资源,在某个NodeManager上启动Container,启动ApplicationMaster。

​ (3)ApplicationMaster向ResourceManager注册进行通信,动态申请资源,然后告知NodeManager启动对应的task。

​ (4)所有任务运行完成后,ApplicationMaster注销,释放资源。

3.2 Mapreduce on yarn

​ MarReduce基于yarn的工作原理:通过提交jar包,进行MapReduce处理,可以分为五个概括的过程:

(1)客户端提交提交MapReduce.job

(2)随后yarn的ResourceManager进行资源分配

(3)由NodeManager加载与监控container

(4)通过ApplicationMaster与ResourceManager进行资源的申请和状态交互,由NodeManager管理MapReduce运行时的job

(5)通过hdfs进行job配置文件,jar包的各节点分发。

在这里插入图片描述

详细过程如下:

  • 作业提交:client调用job.waitForCompletion方法,向整个集群提交MapReduce作业 (第1步) ,ResourceManager这时会给应用分配一个application ID,且判断client的输出是否存在,并判断输入,计算split分片信息,将信息反馈给client。client将作业的资源(包括Jar包, 配置文件, split信息)拷贝给HDFS(第3步)。接着, 通过调用资源管理器的submitApplication()来提交作业(第4步).

  • 作业初始化:当资源管理器收到submitApplication()的请求时, 就将该请求发给调度器(scheduler), 调度器分配container, 然后资源管理器在该container内启动ApplicationMaster进程,由NodeManager监控。

    MapReduce的ApplicationMaster可以监控作业的进度和完成报告(第6步)。然后其通过分布式文件系统得到由客户端计算好的输入split(第7步)。然后为每个输入split创建一个map任务, 根据mapreduce.job.reduces创建reduce任务对象

  • 任务分配:ApplicationMaster向ResourceManager请求Container来运行所有的map和reduce任务(第八步),这些请求是通过心跳机制来传输的,包括每个map任务的数据位置,由于ResourceManager的本地化特点,它会优先将任务分配给存储对应数据的节点。

  • 任务运行:当ResourceManager分配Container给ApplicationMaster后,ApplicationMaster会通知各个NodeManager启动Container(9a和9b)来运行任务,任务运行之前会通过HDFS获取需要的jar文件,配置文件,split分片等信息。(第十步)

  • 作业完成:最后任务运行期间会将其进度和状态更新给ApplicationMaster,进而告知用户任务运行情况。待任务结束后,ApplicationMaster关闭,释放资源,作业的信息也会被存入作业历史服务器以便用户核查。

3.3 yarn的生命周期:

申请资源 -> 启动appMaster -> 申请运行任务的container -> 分发task -> 运行task -> task结束 -> 回收container

4. 如何使用yarn

4.1 配置文件
$HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration> 
  <property> 
    <name>mapreduce.framework.name</name>  
    <value>yarn</value> 
  </property> 
</configuration>

$HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration> 
  <property> 
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle</value> 
  </property> 
</configuration>
4.2 yarn启动和停止:

启动RM和NM:

#主节点运行
start-yarn.sh
#停止yarn
stop-yarn.sh

#若RM没有启动,可以单独设置启动和关闭:
yarn-daemon.sh start resourcemanager
yarn-daemon.sh stop resourcemanager

#如果NM没有启动,可以单独启动和关闭
yarn-daemon.sh start nodemanager
yarn-daemon.sh stop nodemanager
4.3 yarn常用命令

yarn application

#查看正在运行的任务
yarn application -list

#杀掉正在运行的任务
yarn application -kill 任务id

#查看节点列表
yarn node -list

#查看节点状况:根据上一步节点列表查看
yarn node -status node3:40652(Node-Id)

#查看yarn依赖的jar环境变量
yarn classpath

5. yarn调度器(重要)

5.1 调度器分类

​ yarn中有三种调度器选择:FIFO Scheduler(先进先出调度器),Capacity Scheduler(容量调度器),Fair Scheduler(均分调度器)

5.2 三种调度器区别
  • hadoop1.x使用的默认调度器就是FIFO。FIFO采用队列方式将一个一个job任务按照时间先后顺序进行服务,比较好理解,哪个任务先进来就先完成它,在继续下一个任务。
  • hadoop2.x使用的默认调度器是Capacity Scheduler。Capacity Schedule调度器以队列为单位划分资源,队列有独立的资源,队列的结构和资源是可以进行配置的。
  • Fair Scheduler调度器会为所有job任务动态调整系统资源,且是平均分配的形式,让任务公平的共享集群资源
5.3 Capacity Scheduler配置方式

​ 调度器的核心就是队列的分配和使用,修改conf/capacity-scheduler.xml可以配置队列。

​ 将HADOOP_HOME/etc/hadoop/中对应的capacity-scheduler.xml配置文件备份到其他地方,然后新建capacity-scheduler.xml文件,添加以下内容:

<?xml version="1.0" encoding="utf-8"?>

<configuration> 
  <property> 
    <name>yarn.scheduler.capacity.root.queues</name>  
    <value>prod,dev</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.dev.queues</name>  
    <value>hdp,spark</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.prod.capacity</name>  
    <value>40</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.dev.capacity</name>  
    <value>60</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>  
    <value>75</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.dev.hdp.capacity</name>  
    <value>50</value> 
  </property>  
  <property> 
    <name>yarn.scheduler.capacity.root.dev.spark.capacity</name>  
    <value>50</value> 
  </property> 
</configuration>

​ 将应用放在哪个队列中,取决于应用本身

在这里插入图片描述

然后程序打包,提交集群运行:

hadoop jar jar包名称  完整类型  hdfs输入文件  输出文件位置

6. yarn应用状态

​ 在官方文档中也可以看到.

  • NEW:新建状态
  • NEW_SAVING:新建保存状态
  • SUBMITTED:提交状态
  • ACCEPTED:接受状态
  • RUNNING:运行状态
  • FINISHED:完成状态
  • FAILED:失败状态
  • KILLED:杀掉状态

运行mr程序显示的map100%,reduce0%进度,就是由第六步的记账本提供的。

容器和task对应,只不过可能是map task或者是reduce task。

后续reduce task的过程也是和记账本的appMaster通信,然后启动和map同样的流程

另外。修改队列属性,添加新队,编辑xml文件后要运行生效:

yarn rmadmin-refreshQueues

修改记录

时间内容
2020年04月10日第一次发布
2020年9月13日删除目录显示
  • 学习参考:《开课吧-大数据开发高级工程师一期》课程

本文为学习课程做的笔记,如有侵权,请联系作者删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值