Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
管理集群资源
任务合理分配资源
Yarn基础框架
YARN 主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。
ResourceManager:(RM)
处理客户端请求
监控NodeManager
启动或监控ApplicationMaster
资源的分配与调度
NodeManager(NM):
管理单个节点上的资源
处理来自ResourceManager的命令
处理来自ApplicationMaster的命令
ApplicationMaster(AM):
为应用程序申请资源并分配给内部的任务
任务的监控与容错
Container:
- Container是YARN中资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
Yarn工作机制
Yarn工作机制
0)MR程序提交到客户端所在的节点。
1)YarnRunner向ResourceManager申请一个Application。
2)RM将该应用程序的资源路径返回给YarnRunner。
3)该程序将运行所需资源提交到HDFS上。
4)程序资源提交完毕后,申请运行mrAppMaster。
5)RM将用户的请求初始化成一个Task任务
6)其中一个NodeManager领取到该任务。
7)该NodeManager创建容器Container,并产生MRAppmaster。
8)Container从HDFS上拷贝资源到本地。
9)MRAppmaster向RM申请运行MapTask资源。
10)RM将运行MapTask任务分配给另外两个NodeManager,另外两个NodeManager分别领取任务并创建容器。
11)MRAppmaster向两个接受到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
12)MrAppmaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
13)ReduceTask向MapTask获取相应分区的数据。
14)程序运行完毕后,MRAppmaster会向RM申请注销自己。
作业提交全过程
作业提交全过程详解
作业提交
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秒会通过waitCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成后,应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
Yarn调度器和调度算法
目前,Hadoop作业调度器有三种:FIFO、容量和公平,Hadoop3.1.3默认的资源调度器是容量。CDH默认调度器是公平调度器。
yarn-default.xml
先进先出调度器。FIFO
FIFO调度器:单队列,根据提交作业的先后顺序,先来先服务。
容量调度器 Capacity Scheduler
Capacity是Yahoo开发的多用户调度器。
容量调度器特点
多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
-
多租户
支持多用户共享集群和多应用程序同时运行
为了防止同一用户的祖业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
容量调度器资源分配算法
1)队列资源分配
从root开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源
2)作业资源分配
默认按照提交作业的优先级和提交时间顺序分配资源
3)容器资源分配
按照容器的优先级分配资源
如果优先级相同,按照数据本地性原则:
(1)任务和数据在同一节点
(2)任务和数据在同一机架
(3)任务和数据不在同一节点也不在同一机架
公平调度器 Fair Scheduler
Fair Scheduler时facebook开发的多用户调度器。
公平调度器原则
同队列的所有任务共享资源,在时间尺度上获得公平的资源。
公平调度器特点
-
与容量调度器相同点
多队列:支持多队列多任务
容量保证:管理员可以为每个队列设置资源最低保障和资源使用上限。
灵活性:如果一个队列中的资源有剩余,可以暂时共享给哪些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列戒掉的资源会归还给该队列。
多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。
-
与容量调度器不同点
-
核心调度策略不同
容量调度器:优先选择资源利用率低的队列
公平调度器:优先选择对资源的缺额比例大的
-
每个队列可以单独设置资源分配方式
容量调度器:FIFO、DRF(内存+cpu)
公平调度器:FIFO、DRF、FAIR
-
缺额
公平调度器设计的目标时:在时间尺度上,所有作业获得公平的资源。某一时刻一个作业应获资源和实际获取资源的差距叫缺额。
调度器会优先为缺额大的作业分配资源
公平调度器队列资源分配方式
1)FIFO策略
公平调度器每个队列资源分配策略如果选择FIFO的话,此时公平调度器相当于上面讲过的容量调度器。
2)Fair策略
Fair策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可得到1/3的资源。
具体资源分配流程和容量调度器一致:
选择队列
选择作业
选择容器
以上三步,每一步都是按照公平策略分配资源
实际最小资源份额:mindshare=min(资源需求量,队列配置的最小资源)
是否饥饿:isNeedy=资源使用量<mindshare(实际最小资源份额)
资源分配比:minShareRatio = 资源使用量/Max(mindshare,1)
资源使用权重比:useToWeightRatio = 资源使用量/权重
3)DRF策略
DRF(Dominant Resource Fairnesss),我们之前说的资源,都是单一标准,例如只考虑内存。但是很多时候我们资源有很多种,例如内存,CPU,网络带宽等。
Yarn常用命令
yarn application 查看任务
1)列出所有Application
yarn application -list
2)根据Application状态过滤
yarn application -list -appStates KILLED
3)kill掉Application
yarn application -kill <applicationId>
yarn logs查看日志
1)查询application日志:
yarn logs -applicationId <applicationId>
2)查看Container日志
yarn logs -applicationId <applicationId> -containerId <containerId>
yarn applicatinattempt 查看尝试运行的任务
1)列出所有Application尝试的列表:
yarn applicationattempt -list <ApplicationId>
2)打印ApplicationAttemp状态:
yarn applicationattempt -status <ApplicationAttemptId>
yarn container查看容器
1)列出所有Container:
yarn container -list <ApplicationAttemptId>
2)打印Container状态:
yarn container -status <ContainerId>
yarn Node节点状态
列出所有节点:
yarn node -list -all
yarn rmadmin更新配置
加载队列配置:
yarn rmadmin -refreshQueues
yarn queue查看队列
打印队列信息:
yarn queue -status <QueueName>
Yarn生产环境核心配置参数
1)ResourceManager相关
yarn.resourcemanager.scheduler.class 配置调度器,默认容量 yarn.resourcemanager.scheduler.client.thread-count ResourceManager处理调度器请求的线程数量,默认50
2)NodeManager相关
yarn.nodemanager.resource.detect-hardware-capabilities 是否让yarn自己检测硬件进行配置,默认false yarn.nodemanager.resource.count-logical-processors-as-cores 是否将虚拟核数当作CPU核数,默认false yarn.nodemanager.resource.pcores-vcores-multiplier 虚拟核数和物理核数乘数,例如:4核8线程,该参数就应设为2,默认1.0
yarn.nodemanager.resource.memory-mb NodeManager使用内存,默认8G yarn.nodemanager.resource.system-reserved-memory-mb NodeManager为系统保留多少内存 以上二个参数配置一个即可 yarn.nodemanager.resource.cpu-vcores NodeManager使用CPU核数,默认8个
yarn.nodemanager.pmem-check-enabled 是否开启物理内存检查限制container,默认打开 yarn.nodemanager.vmem-check-enabled 是否开启虚拟内存检查限制container,默认打开 yarn.nodemanager.vmem-pmem-ratio 虚拟内存物理内存比例,默认2:1
3)Container相关
yarn.scheduler.minimum-allocation-mb 容器最最小内存,默认1G yarn.scheduler.maximum-allocation-mb 容器最最大内存,默认8G yarn.scheduler.minimum-allocation-vcores 容器最小CPU核数,默认1个 yarn.scheduler.maximum-allocation-vcores 容器最大CPU核数,默认4个
小结:
学习yarn的基础介绍。