1 YARN Web UI服务
1.1 WebUI V1服务
-
YARN提供了一个WebUI V1服务,该服务属于内置服务,随着RM启动而启动。V1表示这是第一代版本的WebUI服务。
-
用户可以通过浏览器登录界面,来监视群集、队列、应用程序、服务、节点信息。
-
还可以查看集群详细配置的信息,检查各种应用程序和服务的日志。
-
浏览器输入http://RM_HOST:8088/访问YARN WebUI服务。
-
页面打开后,以列表形式展示处于各种状态(接收、执行、完成、杀死、失败)的各种应用程序,如MapReduce应用、Spark应用、Flink应用等,与点击页面左侧Application栏目红线框Applications链接显示的内容一致。
1.2 JobHistoryServer服务
概述:
- 默认情况下,YARN RM重启之后,已经完成的作业和正在执行的作业信息都会丢失。
- 针对正在执行的作业恢复,可以设置RM重启机制恢复(yarn.resourcemanager.recovery.enabled)。
- JobHistoryServer(JHS)属于YARN的一项系统服务,仅存储已经运行完成的MapReduce应用程序的作业历史信息,并不会存储其他类型(如Spark、Flink等)应用程序的作业历史信息。
- 当启用JHS服务时,建议开启日志聚合功能,利于统一管理和分析日志。否则每个Container的运行日志是存储在NodeManager节点本地,查看日志时需要访问各个NodeManager节点。
web查看:浏览器登录JHS http://node1:19888/
查看已完成MR作业历史信息:
- 在JHS主页面上,会列举中所有在YARN上已经执行完的MR作业信息。通过点击JobID可以进入查看详细信息。
- 查看MR作业中各个Task的详细信息
- lMR作业历史信息保存位置由参数mapreduce.jobhistory.done-dir指定。(mapred-default.xml)
1.3 TimelineServer服务
概述:
- 由于Job History Server仅对MapReduce应用程序提供历史信息支持,其他应用程序的历史信息需要分别提供单独的HistoryServer才能查询和检索。例如Spark的Application需要通过Spark自己提供的org.apache.spark.deploy.history.HistoryServer来解决应用历史信息。
- 为了解决这个问题,YARN新增了Timeline Server组件,以通用的方式存储和检索应用程序当前和历史信息。
- 中文语境下,将Timeline Server称之为时间轴服务。
职责:
- 存储应用程序的特定信息
收集和检索指定应用程序或者框架的某些信息。例如,Hadoop的MR框架会产生像是Map task数量、Reduce task数量、Counter等信息,应用开发人员可以通过TimelineClient,在Application Master或者Container中将特定的信息发送到Timeline服务器。同时Timeline提供了REST API,用于查询Timeline中存储的信息,并可以通过应用程序或者框架的特定UI进行展示。
- 保存已完成应用程序的常规信息
在之前此功能只能通过JobHistory Server实现,并且只支持MR Job。随着Timeline服务的出现, JobHistory Server的功能可以看做是Timeline的一部分。
版本介绍:
- 到目前,TimelineServer有V1、V1.5和V2共三个版本。
V1仅限于写入器/读取器和存储的单个实例,无法很好地扩展到小型群集之外,伸缩性不足;
V2还处于alpha状态,实现了读写分离,后端依赖HBase;
官方文档:
http://hadoop.apache.org/docs/r3.1.4/hadoop-yarn/hadoop-yarn-site/TimelineServer.html
http://hadoop.apache.org/docs/r3.1.4/hadoop-yarn/hadoop-yarn-site/TimelineServiceV2.html
web查看:http://node1:8188/
2 YARN操作维护命令
概述:
- YARN给用户提供了一个脚本命令,位于${HADOOP_HOME}/bin/yarn,用户可以使用该命令操作维护YARN集群。
- 在不带任何参数的情况下运行yarn脚本会打印所有命令的描述,命令分为用户命令和管理命令两大类。
- 官方指导地址https://hadoop.apache.org/docs/r3.1.4/hadoop-yarn/hadoop-yarn-site/YarnCommands.html
2.1 User用户命令
概述:用户命令主要包括对application、applicationattempt、classpath、container、jar、logs、node、queue和Version的使用。
2.1.1 application
使用方式:
yarn application [options]
#查看帮助信息
yarn application --help
常用的相关操作:
#查看所有的Application 仅显示状态为SUBMITTED、ACCEPTED、RUNNING应用
yarn application -list
#查看状态为ALL的Application列表
yarn application -list -appStates ALL
#杀死某一个Application
yarn application -kill application_1573364048641_0004
#查看某一个Application的统计报告
yarn application -status application_1614179148030_0001
#查看类型为MAPREDUCE的Application列表
yarn application -list -appTypes MAPREDUCE
#移动一个Application到default队列
yarn application -movetoqueue application_1573364048641_0004 -queue default
#修改一个Application的优先级
yarn application -updatePriority 0 -appId application_1573364048641_0006
2.1.2 jar
使用方法:
yarn jar xxx.jar [mainClass] args...
#通常使用这个命令提交作业到yarn上执行
常用的相关操作:
cd /export/server/hadoop-3.1.4/share/hadoop/mapreduce/
#提交官方自带MR示例 评估圆周率值
yarn jar hadoop-mapreduce-examples-3.1.4.jar pi 2 2
2.1.3 applicationattempt
使用方法:
yarn applicationattempt [options]
#attempt可以理解为一个app应用内部的一次尝试执行过程(AM Task)
#applicationattempt指的是AM尝试执行过程
常用的相关操作:
#标记某一次applicationattempt失败
yarn applicationattempt -fail appattempt_1573364048641_0004_000001
#查看某个应用所有的attempt
yarn applicationattempt -list application_1614179148030_0001
#查看具体某一个applicationattemp的报告
yarn applicationattempt -status appattempt_1614179148030_0001_000001
2.1.4 container
使用方法:
yarn container [options]
#可以根据attemptID操作作业的Container相关信息
常用的相关操作:
#列出指定的attemptID的所有container信息
#attemptID可以从RM WebUI 或者时间轴服务上获取
yarn container -list <Application Attempt Id>
#打印容器的状态。
yarn container -status <ContainerId>
2.1.5 logs
使用方法:
yarn logs -applicationId <application ID> [options]
#日志相关的操作命令
常用的相关操作:
#查看应用程序所有的logs 此操作慎重 显示内容较多
yarn logs -applicationId application_1614179148030_0001
#指定显示内容大小
yarn logs -applicationId application_1614939306044_0001 -size 100
#查看应用程序某个container运行所在节点的log
yarn logs -applicationId application_1614179148030_0001 -containerId container_e01_1614179148030_0001_01_000001
2.1.6 queue
使用方法:
yarn queue [options]
#队列相关的操作命令
常用的相关操作:
#查看某个queue的状态 这里指定查看default
yarn queue -status default
2.1.7 node
使用方法:
yarn node [options]
#集群节点操作命令
常用的相关操作:
#查看yarn所有从节点
yarn node -list -all
#查看yarn所有正在运行的节点
yarn node -list -states RUNNING
#查看yarn所有节点的详情
yarn node -list -showDetails
#查看yarn某一个节点的报告
yarn node -status node1.itcast.cn:44929
2.1.8 version
使用方法:
yarn version
使用方法:
yarn container [options]
#可以根据attemptID操作作业的Container相关信息
2.2 admin管理命令
概述:管理命令主要包括对daemonlog、nodemanager、proxymanager、resourcemanager、rmadmin、scmadmin、sharedcachemanager和timelineserver的使用。
2.2.1 resourcemanager|nodemanager
使用方法:
yarn resourcemanager [options]
#针对RM的操作命令
常用的相关操作:
#启动某个节点的resourcemanager
yarn resourcemanager
#启动某个节点的nodemanager
yarn nodemanager
#格式化resourcemanager的RMStateStore
yarn resourcemanager -format-state-store
#删除RMStateStore中的Application
yarn resourcemanager -remove-application-from-state-store <appId>
2.2.2 proxyserver
使用方法:
#启动某个节点的proxyserver,使用代理的原因是为了减少通过YARN进行基于Web的攻击的可能性。
yarn proxyserver
YARN Proxy Server服务需要提前配置:
<property>
<name>yarn.web-proxy.address</name>
<value>node3.itcast.cn:8089</value>
</property>
2.2.3 daemonlog
使用方法:
yarn daemonlog -getlevel <host:httpport> <classname>
yarn daemonlog -setlevel <host:httpport> <classname> <level>
常用的相关操作:
#查看帮助
yarn daemonlog
#查看RMAppImpl的日志级别
yarn daemonlog -getlevel \
node1.itcast.cn:8088 org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppImpl
#设置RMAppImpl的日志级别
yarn daemonlog -setlevel \
node1.itcast.cn:8088 org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppImpl DEBUG
2.2.4 rmadin
使用方法:
yarn rmadmin [options]
#这个命令比较重要 使用的也较多
常用的相关操作:
#重新加载mapred-queues配置文件
yarn rmadmin -refreshQueues
#刷新ResourceManager的主机信息
yarn rmadmin -refreshNodes
#在ResourceManager上刷新NodeManager的资源
yarn rmadmin -refreshNodesResources
#刷新超级用户代理组映射
yarn rmadmin -refreshSuperUserGroupsConfiguration
#刷新ACL以管理ResourceManager:
yarn rmadmin -refreshAdminAcls
#获取ResourceManager服务的Active/Standby状态
yarn rmadmin -getAllServiceState
#ResourceManager服务执行健康检查,如果检查失败,RMAdmin工具将使用非零退出码退出。
yarn rmadmin -checkHealth rm1
yarn rmadmin -checkHealth rm2
2.2.5 timelineserver
使用方法:
yarn timelineserver
#启动时间轴服务 通常使用下面的命令启动
yarn-daemon.sh start timelineserver
时间轴服务Web UI端口:8188
2.2.6 scmadmin
使用方法:
#scmadmin是ShareCacheManager(共享缓存管理)的管理客户端
yarn scmadmin
常用的相关操作:
#执行清理任务
yarn scmadmin -runCleanerTask
#先启动SCM服务(SharedCacheManager服务)
yarn-daemon.sh start sharedcachemanager
3 YARN资源管理与隔离
概述:
- 在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责资源的分配,而NodeManager则负责资源的供给和隔离。
资源调度分配:ResourceManager将某个NodeManager上资源分配给任务;
资源隔离:NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证;
- Hadoop YARN同时支持内存(memory)和CPU(CPU virtual Core)两种资源的调度。
内存资源的多少会会决定任务的生死,如果内存不够,任务可能会运行失败;相比之下,CPU资源则不同,它只会决定任务运行的快慢,不会对生死产生影响。
3.1 Memory资源
概述:
-
YARN允许用户配置每个节点上可用的物理内存资源;
-
注意,这里是“可用的”,因为一个节点上的内存会被若干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的。
-
默认情况下,YARN采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。
-
由于Cgroups对内存的控制缺乏灵活性(即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报OOM),而Java进程在创建瞬间内存将翻倍,之后骤降到正常值,这种情况下,采用线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,可认为是正常现象,不会将任务杀死),因此YARN未提供Cgroups内存隔离机制。
核心配置参数:
#参数一:yarn.nodemanager.resource.memory-mb
该节点上YARN可使用的物理内存总量,默认是8192(MB);
如果设置为-1,并且yarn.nodemanager.resource.detect-hardware-capabilities为true时,将会自动计算操作系统内存进行设置。
#参数二:yarn.nodemanager.vmem-pmem-ratio
任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1
#参数三:yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
#参数四:yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
#参数五:yarn.scheduler.minimum-allocation-mb
单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
#参数六:yarn.scheduler.maximum-allocation-mb
单个任务可申请的最多物理内存量,默认是8192(MB)。
3.2 CPU资源
概述:
- 在YARN中,CPU资源的组织方式仍在探索中,当前只是非常粗粒度的实现方式。
- CPU被划分成虚拟CPU(CPU virtual Core),此处的虚拟CPU是YARN自己引入的概念,初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,此时可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。
- 用户提交作业时,可以指定每个任务需要的虚拟CPU个数。
- 由于CPU资源的独特性,目前这种CPU分配方式仍然是粗粒度的。
核心配置参数:
#参数一:yarn.nodemanager.resource.cpu-vcores
该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值。
如果设置为-1,并且yarn.nodemanager.resource.detect-hardware-capabilities为true时,将会自动计算操作系统CPU核数进行设置。
#参数二:yarn.scheduler.minimum-allocation-vcores
单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。
#参数三:yarn.scheduler.maximum-allocation-vcores
单个任务可申请的最多虚拟CPU个数,默认是4。
4 YARN资源调度器Scheduler
概述:
- 在理想情况下,应用程序提出的请求将立即得到YARN批准。但是实际中,资源是有限的,并且在繁忙的群集上,应用程序通常将需要等待其某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。
- 在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。
- 一般而言,调度是一个难题,并且没有一个“最佳”策略,为此,YARN提供了多种调度器和可配置的策略供选择。
调度器策略:
- 三种调度器FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)。
- Apache版本YARN默认使用Capacity Scheduler。
- 如果需要使用其他的调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置。
工作队列:
- 工作队列(Queue)是从不同客户端收到的各种任务的集合。
- YARN默认只有一个可用于提交任务的队列,叫做default。当然用户也可以配置队列形成队列树结构。
- Scheduler的本质就是根据何种规则策略去分配资源给队列中的任务。
队列树:
- 在YARN中,有层级队列组织方法,它们构成一个树结构,且根队列叫做root。
- 所有的应用都运行在叶子队列中(即树结构中的非叶子节点只是逻辑概念,本身并不能运行应用)。
- 对于任何一个应用,都可以显式地指定它属于的队列,也可以不指定从而使用username或者default队列。
- 在YARN WebUI界面上可以看到默认的队列组织情况。
4.1 FIFO Scheduler
概述:
- FIFO Scheduler是Hadoop1.x中JobTracker原有的调度器实现,此调度器在YARN中保留了下来。
- FIFO Scheduler是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。
- FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的资源信息作用于这个全局的queue。
优势:
- 无需配置、先到先得、易于执行
坏处:
- 任务的优先级不会变高,因此高优先级的作业需要等待
- 不适合共享集群
配置:修改yarn-site.xml即可
<property>
<name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value>
</property>
4.2 Capacity Scheduler
概述:
- Capacity Scheduler容量调度是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
- Capacity可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
资源划分:
- Capacity Scheduler调度器以队列为单位划分资源。简单通俗点来说,就是一个个队列有独立的资源,队列的结构和资源是可以进行配置的。
- default队列占30%资源,analyst和dev分别占40%和30%资源;且analyst和dev各有两个子队列,子队列在父队列的基础上再分配资源。
每个队列里的应用以FIFO方式调度,每个队列可设定一定比例的资源最低保证和使用上限防止滥用;
而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。
优势:
- 层次化的队列设计(Hierarchical Queues)
层次化的管理,可以更容易、更合理分配和限制资源的使用。
- 容量保证(Capacity Guarantees)
每个队列上都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源。
- 安全(Security)
每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。
- 弹性分配(Elasticity)
空闲的资源可以被分配给任何队列。
当多个队列出现争用的时候,则会按照权重比例进行平衡。
- 多租户租用(Multi-tenancy)
通过队列的容量限制,多个用户就可以共享同一个集群,同时保证每个队列分配到自己的容量,提高利用率
- 操作性(Operability)
Yarn支持动态修改调整队列容量、权限等的分配,可以在运行时直接修改
- 基于用户/组的队列隐射(Queue Mapping based on User or Group)
允许用户基于用户或者组去映射一个作业到特定队列。
官方默认配置:
- 由于Hadoop默认调度策略就是Capacity,因此官方自带默认配置HADOOP_CONF/capacity-scheduler.xml。
- 默认配置中显示全局只有一个队列default,占集群整体容量100。
4.3 Fair Scheduler
概述:
- Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
- Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。
- 公平调度可以在多个队列间工作,允许资源共享和抢占。
如何理解公平共享:
- 有两个用户A和B,每个用户都有自己的队列。
- A启动一个作业,由于没有B的需求,它分配了集群所有可用的资源。
- 然后B在A的作业仍在运行时启动了一个作业,经过一段时间,A,B各自作业都使用了一半的资源。
- 现在,如果B用户在其他作业仍在运行时开始第二个作业,它将与B的另一个作业共享其资源,因此B的每个作业将拥有资源的四分之一,而A的继续将拥有一半的资源。结果是资源在用户之间公平地共享。
队列:
- 默认情况下,所有用户共享一个名为default的队列。
- 可以在提交应用时指定队列,也可以通过配置根据请求中包含的用户名或组来分配队列。
- 在每个队列中,使用调度策略在运行的应用程序之间共享资源。默认设置是基于内存的公平共享。
特性优势:
- 分层队列:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例共享集群。
- 基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。如果任务指定了一个队列,则在该队列中提交任务。
- 资源抢占:根据应用的配置,抢占和分配资源可以是友好的或是强制的。默认不启用资源抢占。
- 保证****最小配额:可以设置队列最小资源,允许将保证的最小份额分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其它队列抢占。当队列资源使用不完时,可以给其它队列使用。这对于确保某些用户、组或生产应用始终获得足够的资源。
- 允许资源共享:即当一个应用运行时,如果其它队列没有任务执行,则可以使用其它队列,当其它队列有应用需要资源时再将占用的队列释放出来。所有的应用都从资源队列中分配资源。
- 默认不限制每个队列和用户可以同时运行应用的数量。可以配置来限制队列和用户并行执行的应用数量。限制并行执行应用数量不会导致任务提交失败,超出的应用会在队列中等待。
5 YARN核心配置参数
概述:
- 在实际项目生产环境,需要调整配置YARN相关核心参数的值,才能更好的管理资源、调度任务执行及使用资源。
- 主要针对RM、NM、Container组件进行设置。
- 相关参数默认值可以参考官方资料,默认位于yarn-default.xml中。用户可以在yarn-site.xml中覆盖。https://hadoop.apache.org/docs/r3.1.4/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
5.1 RM核心参数
针对ResourceManager主节点来说,需要设置调度器类型及请求线程数据量。
# 设置YARN使用调度器,默认值:(不同版本YARN,值不一样)
yarn.resourcemanager.scheduler.class
#Apache 版本 YARN ,默认值为容量调度器;
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
#CDH 版本 YARN ,默认值为公平调度器;
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
#ResourceManager处理调度器请求的线程数量,默认50,如果YARN运行任务Job比较多,可以将值调整大一下。
yarn.resourcemanager.scheduler.client.thread-count
5.2 NM核心参数
NodeManager运行在每台机器上,负责具体的资源管理
yarn.nodemanager.resource.detect-hardware-capabilities
#是否让yarn自己检测硬件进行配置,默认false,如果设置为true,那么就会自动探测NodeManager所在主机的内存和CPU。
yarn.nodemanager.resource.count-logical-processors-as-cores
#是否将虚拟核数当作CPU核数,默认false。
yarn.nodemanager.resource.pcores-vcores-multiplier
#确定如何将physcal核心转换为vcore的乘数。vcore的数量将计算为CPU数量*乘数。
yarn.nodemanager.resource.memory-mb
#NodeManager可以使用内存,默认8192M
yarn.nodemanager.resource.system-reserved-memory-mb
保留给非YARN进程的物理内存量(以MB为单位)。
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;
5.3 Container核心参数
当应用程序提交运行至YARN上时,无论是AppMaster运行,还是Task(MapReduce框架)或Executor(Spark框架)或TaskManager(Flink框架)运行,NodeManager将资源封装在Contanier容器中,以便管理和监控。
参数一:yarn.scheduler.minimum-allocation-mb
#可申请容器的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
参数二:yarn.scheduler.maximum-allocation-mb
#可申请的最多物理内存量,默认是8192(MB)。高于此值的内存请求将引发InvalidResourceRequestException。
参数三:yarn.scheduler.minimum-allocation-vcores
#可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。
参数四:yarn.scheduler.maximum-allocation-vcores
#单个任务可申请的最多虚拟CPU个数,默认是4。高于此值的请求将引发InvalidResourceRequestException。