第一章 资源调度框架YARN理论

1.1 YARN概述

分布式操作系统

hadoop 1.xMapReduce主从架构    主节点JobTracker   从节点TaskTrackerslot
hadoop 2.xMapReduce编程API + YARN主从架构     主节点ResourceManager  从节点NodeManagerContainer
hadoop 3.xCommonHDFS   纠删码  MapReduceYARNMapReduce编程API + YARN

YARN(Yet Another Resource Negotiator)

Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。

有以下注意点:

1、yarn 并不清楚用户提交的程序的运行机制

2、yarn 只提供运算资源的调度(用户程序向 yarn 申请资源,yarn 就负责分配资源)

3、yarn 中的主管角色叫 ResourceManager

4、yarn 中提供运算资源的角色叫 NodeManager

5、yarn 与运行的用户程序解耦

6、MapReduce、Spark、Flink等运算框架都可以整合在 yarn 上运行

7、yarn 就成为一个通用的资源调度平台

1.2 YARN 的重要概念

1、ResourceManager

​ ResourceManager 是基于应用程序对集群资源的需求进行调度的 Yarn 集群主控节点,负责协调和管理整个集群的资源,响应用户提交的不同类型应用程序的解析,调度,监控等工作。ResourceManager 会为每一个 Application 启动一个 MRAppMaster, 并且 MRAppMaster 分散在各个 NodeManager 节点。

​ 由两个组件构成:调度器(Scheduler)和应用程序管理器(ApplicationsManager,ASM)

2、NodeManager

​ NodeManager 是 YARN 集群当中真正资源的提供者,是真正执行应用程序的容器的提供者, 监控应用程序的资源使用情况,并通过心跳向集群资源调度器 ResourceManager 进行汇报。

3、Container

​ Container 是一个抽象出来的逻辑资源单位。它封装了一个节点上的 CPU,内存,磁盘,网络等信息,MapReduce 程序的所有 Task都是在一个容器里执行完成的,容器大小可以动态调整。

1.3 调度器

1.3.1 FIFO(先进先出调度器)

FIFO(First In First Out先进先出调度器):单队列的,根据提交作业的先后顺序,先来先服务

FIFO优缺点:

优点:简单方便
缺点:不支持多队列,生产环境使用较少

1.3.2 Capacity Scheduler (容量调度器)

1.3.3 Fair Scheduler(公平调度器)

1、特点

2、缺额的概念

概念: 某一时刻一个作业应获资源和实际获取资源的差距叫缺额

公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。
调度器会优先为缺额大的作业分配资源

3、队列内部资源分配策略

1、FIFO策略
公平调度器每个队列资源分配策略可以选择FIFO,这样的话,公平调度器相当于容量调度器。
2、Fair策略
Fair 策略(默认)是一种基于公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这个时候用,如果一个队列中有两个程序运行,那么每个程序可得到1/2的资源。若是有三个应用程序同时运行,则每个应用程序可得到1/3的资源。
具体资源分配流程和容量调度器一致;
(1)选择队列
(2)选择作业
(3)选择容器
以上三步都是按照公平策略分配资源
3、DRF策略
DRF(Dominant Resource Fairness),前面说的资源,基本上都是单一标准,比如只考虑内存(这个其实就是Yarn默认的情况)。但是资源有很多种,例如内存,CPU,网络带宽,磁盘等等,这样我们很难通过单个标准来衡量两个应用应该分配的资源比例。所以在YARN中,可以用DRF来决定多资源如何调度:
例如:集群一共有300 CPU和100T 内存,而应用1需要(3 CPU, 5TB),应用2需要(30 CPU,1TB)。则两个应用分别需要1(1%CPU, 5%内存)和2(10%CPU, 1%内存)的资源,这就意味着1是内存主导的, 2是CPU主导的,针对这种情况,可以选择DRF策略对不同应用进行不同资源(CPU和内存)的一个不同比例的限制。

4、来个例子吧

(1)队列资源分配

root
|---queue1  40%
|---queue2  30%
|---queue3  30%|---Job000 7.5%|---Job001 7.5%|---Job002 7.5%|---Job003 7.5%假设总资源是100,有三个队列queue1、queue2、queue3,对资源的需求分别为:40、30、30
第一次计算:100/3 = 33.333queue1:分到33.333 --> 实际需要40 ——> 所以少了6.666queue2:分到33.333 --> 实际需要30 ——> 所以多了3.333queue3:分到33.333 --> 实际需要30 ——> 所以多了3.333第二次计算:拿多出来总数除以需要分配的队列的个数(3.333+3.333)/ 1 = 6.666queue1:分到33.333 + 6.666 --> 分到40queue2:分到30queue3:分到30

(2)队列内部Job作业资源分配

不加权的方式:

关注的是Job的个数进行分配。
示例:有一条队列总资源为20个,有4个job,对资源的需求分别为:job1:2job2:4job3:6job4:8第一次计算:20/4 = 5job1:分到5 --> 实际需要2 ——> 所以多了3job2:分到5 --> 实际需要4 ——> 所以多了1job3:分到5 --> 实际需要6 ——> 所以少了1job4:分到5 --> 实际需要8 ——> 所以少了3第二次计算:拿多出来总数除以需要分配的job的个数(3+1)/2 = 2job1:分到2job2:分到4job3:分到5 --> 实际需要6 ——> 所以少了1 -->再分2个-->分到7 --> 实际需要6 ——> 所以多了1job4:分到5 --> 实际需要8 ——> 所以少了3 -->再分2个-->分到7 --> 实际需要8 ——> 所以少了1第三次计算:拿多出来总数除以需要分配的job的个数1 / 1 = 1 job1:分到2job2:分到4job3:分到6job4:分到5 --> 实际需要8 ——> 所以少了3 -->再分2个-->分到7 --> 实际需要8 ——> 所以少了1 -->再分1个 --> 分到8 (这个就是实际需要的)

加权的方式:

关注的是Job的权重进行分配
示例:有一条队列总资源为20个,有4个job,对资源的需求分别为:job1:2job2:4job3:6job4:8对应的权重是:job1:2job2:3job3:2job4:3第一次计算:20/(2+3+2+3) = 2job1:分到4 --> 实际需要2 ——> 所以多了2job2:分到6 --> 实际需要4 ——> 所以多了2job3:分到4 --> 实际需要6 ——> 所以少了2job4:分到6 --> 实际需要8 ——> 所以少了2第二次计算:拿多出来总数除以需要分配的job的个数(2+2)/2 = 2job1:分到2job2:分到4job3:分到4 --> 实际需要6 ——> 所以少了2 -->再分2个-->分到6(等于实际需要的)job4:分到6 --> 实际需要8 ——> 所以少了2 -->再分2个-->分到8(等于实际需要的)

1.4 架构图

1.5 作业提交流程

1、用户向 YARN 中提交应用程序,其中包括 ApplicationMaster 程序,启动 ApplicationMaster 的命令,用户程序等

2、ResourceManager 为该程序分配第一个 Container,并与对应的 NodeManager 通讯,要求它在这个 Container 中启动应用程序 ApplicationMaster

3、ApplicationMaster 首先向 ResourceManager注册,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态,然后将为各个任务申请资源,并监控它的运行状态,直到运行结束,重复 4 到 7 的步骤

4、ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源

5、一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通讯,要求它启动任务

6、NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务

7、各个任务通过RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态。

8、应用程序运行完成后,AM 向 RM 注销并关闭自己。

画个图吧!!

第二章 资源调度框架YARN实践

2.1 先修改一下配置

2.1.1 修改 yarn-site.xml

运行之前先给之前的hadoop配置中的yarn-site.xml里面添加如下内容,多个节点都要加。不加在8088页面中看不到Active Nodes的个数。

<configuration>
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value>
</property>
<property><name>yarn.resourcemanager.hostname</name><value>hadoop10</value>
</property>
<property><name>yarn.resourcemanager.address</name><value>hadoop10:8032</value>
</property>
<property><name>yarn.resourcemanager.scheduler.address</name><value>hadoop10:8030</value>
</property>
<property><name>yarn.resourcemanager.resource-tracker.address</name><value>hadoop10:8031</value>
</property>
</configuration>

2.1.2 修改mapred-site.xml

下面的配置是 让MapReduce程序运行在Yarn之上 ,这个参数默认是local

<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>

然后在运行jar的时候,会出现问题,例如运行

[root@hadoop10 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.2.2.jar pi 50 50

报错如下:

2021-09-22 19:36:51,215 INFO mapreduce.Job:  map 0% reduce 0%
2021-09-22 19:36:51,229 INFO mapreduce.Job: Job job_1632310484251_0001 failed with state FAILED due to: Application application_1632310484251_0001 failed 2 times due to AM Container for appattempt_1632310484251_0001_000002 exited with  exitCode: 1
Failing this attempt.Diagnostics: [2021-09-22 19:36:50.769]Exception from container-launch.
Container id: container_1632310484251_0001_02_000001
Exit code: 1[2021-09-22 19:36:50.797]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMasterPlease check whether your etc/hadoop/mapred-site.xml contains the below configuration:
<property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>[2021-09-22 19:36:50.797]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMasterPlease check whether your etc/hadoop/mapred-site.xml contains the below configuration:
<property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>For more detailed output, check the application tracking page: http://hadoop10:8088/cluster/app/application_1632310484251_0001 Then click on links to logs of each attempt.
. Failing the application.
2021-09-22 19:36:51,247 INFO mapreduce.Job: Counters: 0
Job job_1632310484251_0001 failed!

解决方法很简单:在mapred-site.xml 增加以下配置

<property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

截图如下:

这样就解决了上面遇到的问题了。也可以改成绝对路径。

2.2 启动YARN和历史服务器

启动命令为:

start-yarn.sh

链接为:http://hadoop10:8088/cluster

正常启动之后页面如下:

启动历史服务器

启动命令:

[root@hadoop10 sbin]# pwd
/software/hadoop/sbin
[root@hadoop10 sbin]# mr-jobhistory-daemon.sh start historyserver或者使用下面的新命令:
[root@hadoop10 hadoop]# mapred --daemon start historyserver
[root@hadoop10 hadoop]# jps
15458 JobHistoryServer
15082 ResourceManager
14589 NameNode
15550 Jps
[root@hadoop10 hadoop]#
[root@hadoop10 hadoop]# mapred --daemon stop historyserver

页面访问链接为:

http://hadoop10:19888/jobhistory

2.3 动手实践

2.3.1 查看任务

1、列出来所有的。

[root@hadoop10 hadoop]# yarn application -list
2021-09-22 20:02:15,689 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):0Application-Id       Application-Name        Application-Type          User       Queue               State         Final-State         Progress                        Tracking-URL
[root@hadoop10 hadoop]# 

2、根据Application状态查询:yarn application -list -appStates (所有状态:ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)

[root@hadoop10 hadoop]# yarn application -list -appStates FINISHED
2021-09-22 20:14:36,133 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Total number of applications (application-types: [], states: [FINISHED] and tags: []):1Application-Id       Application-Name        Application-Type          User       Queue               State         Final-State         Progress                        Tracking-URL
application_1632311749018_0001       QuasiMonteCarlo               MAPREDUCE          root     default            FINISHED           SUCCEEDED             100% http://hadoop12:19888/jobhistory/job/job_1632311749018_0001
[root@hadoop10 hadoop]# 

2.3.2 查看日志

1、查询Application应用日志

[root@hadoop10 hadoop]# yarn logs -applicationId job_1632311749018_0001

2、查看Container容器日志

[root@hadoop10 hadoop]# yarn logs -applicationId application_1632311749018_0001 -containerId container_1632311749018_0001_01_000001

2.3.3 查看attempt的任务

1、列出所有Application尝试的列表
yarn applicationattempt -list <ApplicationId>
[root@hadoop10 hadoop]# yarn applicationattempt -list application_1632311749018_0001
2021-09-22 20:21:34,413 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Total number of application attempts :1ApplicationAttempt-Id                   State                        AM-Container-Id                        Tracking-URL
appattempt_1632311749018_0001_000001                FINISHED    container_1632311749018_0001_01_000001  http://hadoop10:8088/proxy/application_1632311749018_0001/2、打印ApplicationAttemp状态
yarn applicationattempt -status <ApplicationAttemptId>
[root@hadoop10 hadoop]# yarn applicationattempt -status appattempt_1632311749018_0001_000001
2021-09-22 20:22:49,416 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Application Attempt Report : ApplicationAttempt-Id : appattempt_1632311749018_0001_000001State : FINISHEDAMContainer : container_1632311749018_0001_01_000001Tracking-URL : http://hadoop10:8088/proxy/application_1632311749018_0001/RPC Port : 45512AM Host : hadoop12Diagnostics :
[root@hadoop10 hadoop]#

2.3.4 查看容器

1、列出所有Container
yarn container -list <ApplicationAttemptId>
[root@hadoop10 hadoop]# yarn container -list appattempt_1632311749018_0001_000001
2021-09-22 20:28:43,314 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Total number of containers :0Container-Id             Start Time             Finish Time                   State                    Host       Node Http Address                                LOG-URL
2、打印Container状态
yarn container -status <ContainerId>
[root@hadoop10 hadoop]# yarn container -status container_1632311749018_0001_01_000001
2021-09-22 20:29:03,732 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Container with id 'container_1632311749018_0001_01_000001' doesn't exist in RM or Timeline Server.

注意:只有任务在跑的过程中才能看到container的状态

2.3.5 队列相关

1、打印默认队列信息
[root@hadoop10 hadoop]# yarn rmadmin -refreshQueues
2021-09-22 20:30:56,914 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8033
[root@hadoop10 hadoop]# yarn queue -status default
2021-09-22 20:31:46,890 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Queue Information :
Queue Name : defaultState : RUNNINGCapacity : 100.00%Current Capacity : .00%Maximum Capacity : 100.00%Default Node Label expression : <DEFAULT_PARTITION>Accessible Node Labels : *Preemption : disabledIntra-queue Preemption : disabled2、加载更新队列信息
[root@hadoop10 hadoop]# yarn rmadmin -refreshQueues
2021-09-22 20:32:15,068 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8033

2.3.6 查看节点状态

[root@hadoop10 hadoop]# yarn node -list -all
2021-09-22 20:33:19,077 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
Total Nodes:2Node-Id         Node-State Node-Http-Address   Number-of-Running-Containershadoop11:41778          RUNNING     hadoop11:8042                              0hadoop12:37299          RUNNING     hadoop12:8042                              0
[root@hadoop10 hadoop]# 

声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。

By luoyepiaoxue2014

B站: https://space.bilibili.com/1523287361 点击打开链接
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

浅析资源调度框架YARN相关推荐

  1. 大数据快速入门(06):秒懂资源调度框架 YARN

    一.第一代资源管理器为什么会被淘汰掉 我们知道,hadoop 主要是由三部分组成,HDFS (hadoop 分布式文件系统),MapReduce(分布式计算框架),还有一个就是分布式集群资源调度框架 ...

  2. 资源调度框架YARN

    YARN产生背景 MapReduce1.x存在的问题 在1.x版本中,架构也是master/slave的,对应的角色是分别是JobTracker和TaskTracker,一个作业可以拆分成MapTas ...

  3. Hadoop资源调度框架YARN

    本文概述: 1.YARN概述 2.YARN架构 3.YARN执行流程 4.YARN容错 5.YARN环境搭建 准备工作:     之前博主有发过Hadoop集群环境的搭建以及分布式环境的搭建,可以参考 ...

  4. Yarn 资源调度框架

    learn from 从0开始学大数据(极客时间) Hadoop 主要是由三部分组成: 分布式文件系统 HDFS 分布式计算框架 MapReduce 分布式集群资源调度框架 Yarn Yarn 的架构

  5. 再见了 HDFS!这个资源调度框架已成气候!

    这两天有粉丝问我,在一个成熟大数据系统中,最不能缺少的核心是什么? 我仔细思考了一下,是消息系统之王的 Kafka 吗?不,还有 RocketMQ 和 Pulsar 可以选. 是人人都会接触的协调系统 ...

  6. Yarn 源码 | 分布式资源调度引擎 Yarn 内核源码剖析

    曾有人调侃:HBase 没有资源什么事情也做不了,Spark 占用了资源却没有事情可做? 那 YARN了解一下? 01 YARN! 伴随着Hadoop生态的发展,不断涌现了多种多样的技术组件 Hive ...

  7. [转载]浅析jQuery框架与构造对象

    浅析jQuery框架与构造对象 这是一些分析jQuery框架的文字 针对jQuery 1.3.2版本 面向的读者应具备以下要求 1.非常熟悉HTML 2.非常熟悉javascript语法知识 3.熟悉 ...

  8. 自顶向下浅析go-iris框架

    自顶向下浅析go-iris框架 1. web框架的工作流程 2. go-iris框架简析 2.1 代码示例 构建web服务流程 基础示例 package mainimport ("githu ...

  9. Hadoop 新 MapReduce 框架 Yarn 详解

    Hadoop MapReduceV2(Yarn) 框架简介 原 Hadoop MapReduce 框架的问题 对于业界的大数据存储及分布式处理系统来说,Hadoop 是耳熟能详的卓越开源分布式文件存储 ...

最新文章

  1. 使用JMeter压力测试
  2. i基准指令集 mips_mips addiu
  3. MAGIX Photostory Deluxe 2021中文版
  4. python哪些类型可以作为迭代器_详解Python迭代和迭代器
  5. ffmpeg支持G711音频和H.264视频数据封装为mp4
  6. Apache Jserv protocol
  7. java zip文件夹_如何使用java压缩文件夹成为zip包
  8. HTML常用meta大全
  9. python爬虫从入门到放弃-python爬虫从入门到放弃(二)- 爬虫的深层原理
  10. 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
  11. 【BZOJ】2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(dp)
  12. 为什么手机有卡却突然显示无服务器,手机突然显示“无服务”,原因是什么?...
  13. UE4中程序驱动的LookAt动画
  14. 如何使用3D Converter将2D视频转换为3D?
  15. 彻底删除windos8 打印机驱动程序
  16. linux版的百度云怎么样,有些人用Linux版百度网盘不限速,有些则速度很慢
  17. Texworks中文论文编辑排版优秀
  18. python+ tkinter做的一个项目辅助测试工具
  19. Win10正式版怎么激活?
  20. android 10 上传图片问题

热门文章

  1. win10取消文件的默认打开方式
  2. One hundred years of uncertainty
  3. 报错:Process finished with exit code -1073741819 (0xC0000005)
  4. 越来越稳!Kubernetes 1.8.0 版本发布
  5. 微信小程序swiper上下滑动卡顿
  6. 日本使用ips细胞制作“类器官”的最新进展
  7. 小程序baes64转普通格式
  8. 自己为什么活着,活着的意义是什么?
  9. 03-白龙马与拉磨驴的人生
  10. JMX学习笔记(四) JMX RMI