YARN 生产详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YARN 生产详解相关的知识,希望对你有一定的参考价值。
参考技术A 前言:上节课我们讲了 MR job的提交YARN的工作流程 与 YARN的架构,本次课程详细讲讲YARN,多多总结。
YARN(主从) 资源 + 作业调度管理
YARN:是一种新的 Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
ResourceManager(RM):主要接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。
ApplicationManager(作业):应用程序管理,它是负责系统中所有的job,包括job的提交与调度器协商资源来启动ApplicationMaster(AM)和监控(AM)运行状态,并且失败的时候能够重新启动它,更新分配给一个新的Container容器的进度或者状态,除了资源它不管,它就负责job
Scheduler(调度器):更具容量队列的限制条件将我们系统中的资源分配给正在运用的一个应用程序先进先出调度器 :一个作业运行完了,另一个才能运行
yarn的内置调度器:
1.FIFO先进先出,一个的简单调度器,适合低负载集群。(适合任务数量不多的情况下使用)
2.Capacity调度器,给不同队列(即用户或用户组)分配一个预期最小容量,在每个队列内部用层次化的FIFO来调度多个应用程序。(适用于有很多小的任务跑,需要占很多队列,不使用队列,会造成资源的浪费)
3.Fair公平调度器,针对不同的应用(也可以为用户或用户组),每个应用属于一个队列,主旨是让每个应用分配的资源大体相当。(当然可以设置权重),若是只有一个应用,那集群所有资源都是他的。 适用情况:共享大集群、队列之间有较大差别。(生产使用)
capacity调度器的启用:
在ResourceManager节点上的yarn-site.xml设置
Property===>yarn.resourcemanager.scheduler.class
Value=====>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
capacity调度器的配置:
在目录$HADOOP_HOME/hadoop/etc/hadoop/capacity-scheduler.xml
修改完成后,需要执行下面的命令:
$HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues 使功能动态生效。
NodeManager:主要是节点上的资源和作业管理器,启动Container运行task计算,上报资源、container情况给RM和任务处理情况给AM,整个集群有多个。
ApplicationMaster: 它是负责我们作业的监控并跟踪应用执行状态来重启失败任务的,主要是单个Application(Job)的task管理和调度,向RM进行资源的申请,向NM发出launchContainer指令,接收NM的task处理状态信息。一个job只有一个主程序。
Container: 是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。
Memory:
yarn.nodemanager.resource.memory-mb:64*0.8G=50G (如果内存是64G,Yarn只能用到内存的80%也就是50G)
yarn.scheduler.minimum-allocation-mb: 1G
yarn.scheduler.maximum-allocation-mb: 1G 50/1=50(并行度) 数量是多了,并行度大了
一个作业200 MapTask 4轮才能结束,速度快了 作业可能挂了
yarn.scheduler.maximum-allocation-mb: 16G (生产设16G) 50/16=3(并行度) 数量是少了,并行度小了
一个作业200 MapTask 70轮才能结束,速度慢了 作业时间长 稳定不会挂
工作中一个job可以指定 yarn.scheduler.maximum-allocation-mb的值,但一般不指定。
【若泽大数据实战】使用YARN跑一个jar包
先启动Yarn
进入hadoop的bin目录 在hdfs上创建一个新文件夹
创建一个test.log文件
将当前目录中的某个test.log文件复制到hdfs中(注意要确保当前目录中有该文件)
查看hdfs中是否有我们刚复制进去的文件
进入share的上层目录,提交单词统计任务,实验环境下我们的提交差不多在15秒左右
生产环境中,应该是30~50之间,调优可以压到10秒之内
登录网页查看相关信息:http://192.168.137.30:8088/cluste
Yarn的常用命令
客户端提交job给 Applications Manager 连接Node Manager去申请一个Container的容器,这个容器运行作业的App Mstr的主程序,启动后向App Manager进行注册,然后可以访问URL界面,然后App Mastr向 Resource Scheduler申请资源,拿到一个资源的列表,和对应的NodeManager进行通信,去启动对应的Container容器,去运行 Reduce Task 和 Map Task (两个先后运行顺序随机运行),它们是向App Mstr进行汇报它们的运行状态, 当所有作业运行完成后还需要向Applications Manager进行汇报并注销和关闭
yarn中,它按照实际资源需求为每个任务分配资源,比如一个任务需要1GB内存,1个CPU,则为其分配对应的资源,而资源是用container表示的,container是一个抽象概念,它实际上是一个JAVA对象,里面有资源描述(资源所在节点,资源优先级,资源量,比如CPU量,内存量等)。当一个applicationmaster向RM申请资源时,RM会以container的形式将资源发送给对应的applicationmaster,applicationmaster收到container后,与对应的nodemanager通信,告诉它我要利用这个container运行某个任务。
基于以上考虑,YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会被若
干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的,配置参数如下:
(1)yarn.nodemanager.resource.memory- - mb
表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而
YARN不会智能的探测节点的物理内存总量。
(2)yarn.nodemanager.vmem- - pmem- - ratio
任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。
(3)yarn.nodemanager.pmem- - check- - enabled
是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
(4) yarn.nodemanager.vmem- - check- - enabled
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
(5)yarn.scheduler.minimum- - allocation- - mb
单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
(6)yarn.scheduler.maximum- - allocation- - mb
单个任务可申请的最多物理内存量,默认是8192(MB)。
默认情况下,YARN采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。由于Cgroups对内存的控
制缺乏灵活性(即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报OOM),而Java进程在创建瞬间内存将翻
倍,之后骤降到正常值,这种情况下,采用线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,可认为是正常
现象,不会将任务杀死),因此YARN未提供Cgroups内存隔离机制。
CPU资源的调度和隔离:
目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,
初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,比如某个物
理CPU的计算能力可能是另外一个物理CPU的2倍,这时候,你可以通过为第一个物理CPU多配置几个
虚拟CPU弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。在YARN中,CPU
相关配置参数如下:
(1) yarn.nodemanager.resource.cpu- - vcores
表示该节点上YARN可使用的虚拟CPU个数,默认是4,注意,目前推荐将该值设值为与物理CPU核数
数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物
理CPU总数。
(2) yarn.scheduler.minimum- - allocation- - vcores
单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应
的值改为这个数。
(3) yarn.scheduler.maximum- - allocation- - vcores
单个任务可申请的最多虚拟CPU个数,默认是32。
默认情况下,YARN是不会对CPU资源进行调度的,你需要配置相应的资源调度器。
【若泽大数据】生产场景:
内存改完参数 Yarn是要重启的
1.计算及时性要求比较高:memory不够,cpu是足够的,作业肯定是要挂掉的,立即手工调整oom,设置大,快速出结果,
2.计算机及时性不高:memory够,cpu不够,计算慢,
需求5分钟出1个job:job运行1分钟的时候,oom了内存不够,shell脚本里面可以改参数,修改脚本内存就自动加,
生产:cpu物理和虚拟的比例是1:2的关系(默认), 有的生产会设置1:1
cdh之调整YARN(调优yarn 生产必做优化项)004
2019/3/26 星期二调整YARN
本主题仅适用于YARN群集,并介绍如何为群集调整和优化YARN。
注意:下载Cloudera YARN调整电子表格以帮助计算YARN配置。 有关简短视频概述,请参阅调整YARN应用程序。
概观
此概述提供YARN群集的抽象描述和YARN调整的目标。
YARN群集由主机组成。 主机提供内存和CPU资源。 vcore或虚拟核心是主机CPU的使用份额。
调整YARN主要包括在工作主机上最佳地定义容器。 您可以将容器视为由内存和vcores组成的矩形图。 容器执行任务。
有些任务使用大量内存,对大量数据的处理最少。
其他任务需要大量处理能力,但使用的内存较少。例如,蒙特卡罗模拟评估许多可能的“如果?”场景在相对较小的数据集上使用大量处理能力。
YARN ResourceManager分配内存和vcores以尽可能以最有效的方式使用所有可用资源。理想情况下,很少或没有资源闲置。
应用程序是由一个或多个任务组成的YARN客户端程序。通常,任务使用容器中的所有可用资源。任务不能超过其指定的分配,确保它不能使用所有主机CPU周期或超过其内存分配。
通过将容器配置为使用除开销和其他服务所需的所有可用资源之外,调整YARN主机以优化vcores和内存的使用。
YARN调整有三个阶段。这些阶段对应于YARN调整电子表格中的选项卡。
????1、群集配置,您可以在其中配置主机。
????2、YARN配置,您可以量化内存和vcores。
????3、MapReduce配置,您可以为特定map和reduce任务分配最小和最大资源。
YARN和MapReduce具有许多可配置的属性。有关完整列表,请参阅Cloudera Manager配置属性。 YARN调整电子表格列出了这些属性的基本子集,这些属性最有可能提高常见MapReduce应用程序的性能。
群集配置
在Cluster Configuration选项卡中,您可以为YARN实现定义工作主机配置和群集大小。
机器配置
第1步:工作者主机配置 //表格中写单个主机配置
在下面的输入框中输入您可能的机器配置。 如果您不确定您计划购买哪种机器,请提供一些适合您预期购买的最小值。
与任何系统一样,可用的内存和CPU资源越多,集群处理大量数据的速度就越快。 具有4个带超线程的CPU的机器,每个CPU有6个内核,每个主机提供48个vcore。
2个单元服务器安装中的3 TB硬盘驱动器在JBOD(Just a Bunch Of Disks)配置中有12个可用插槽,这是在创建电子表格时性能和价格之间的合理平衡。 存储成本会随着时间的推移而降低,因此您可能会考虑使用4 TB磁盘。 较大的磁盘价格昂贵,并非所有用例都需要。
两个1千兆位以太网端口在电子表格发布时提供了足够的吞吐量,但10千兆位以太网端口是价格低于速度的选择。
第2步:工人主持人计划
现在您已从步骤1获得基本主机配置,请使用下表将资源(主要是CPU和内存)分配给在主机上运行的各种软件组件。
从您的操作系统开始至少8 GB,为Cloudera Manager开始至少1 GB。 如果CDH以外的服务需要其他资源,请在“其他服务”下添加这些数字。
HDFS DataNode使用至少1个内核和大约1 GB内存。 相同的要求适用于YARN NodeManager。
电子表格列出了几个可选服务:
???? Impala守护程序需要至少16 GB的守护程序。
???? HBase Region Servers需要12-16 GB的内存。
???? Solr服务器至少需要1 GB的内存。
???? Kudu平板电脑服务器至少需要1 GB的内存。
任何剩余资源都可用于YARN应用程序(Spark和MapReduce)。 在此示例中,有44个CPU内核可用。 在每个物理核心上设置所需的vcores乘数,以计算总可用vcores。
第3步:群集大小
定义了群集中每个主机的规范后,输入支持业务案例所需的工作主机数。 要了解并行计算的好处,请将主机数设置为最小值10。
YARN配置
在YARN Configuration选项卡上,验证可用资源并设置每个容器的最小和最大限制。
第4步:在群集上配置YARN
这些是群集的第一组配置值。 您可以在YARN-> Configuration中设置这些值
步骤4和5:验证设置
步骤4从步骤2中提取内存和vcore编号。
步骤5显示群集的总内存和vcores。
转到资源管理器Web UI(通常是http:// <ResourceManagerIP>:8088 /并验证“内存总计”和“Vcores Total”与上面的值匹配。如果您的机器没有坏节点,那么数字应该完全匹配。
步骤6:验证群集上的容器设置
为了让YARN作业干净地运行,您需要配置容器属性。
在步骤6中,您可以更改影响容器大小的值。
最小vcores数应为1.当需要额外的vcores时,一次添加1将导致最有效的分配。 将vcore预留的最大数量设置为节点的大小。
设置内存的最小和最大预留。 增量应该是可以影响性能的最小量。 这里,最小值约为1 GB,最大值约为8 GB,增量为512 MB。
步骤6A:集群容器容量
本节将告诉您群集的容量(就容器而言)。
步骤6A允许您根据输入的数字验证群集中容器的最小和最大数量。
最大可能容器数,基于内存配置
最大可能容器数,基于vcore配置
基于每个磁盘轴2个容器的容器编号
根据内存配置,最小可能容器数
根据vcore配置,最小可能容器数
步骤6B:容器健全检查
本节将针对主机在STEP 6中对容器参数进行一些基本检查。
MapReduce配置
在MapReduce Configuration选项卡上,您可以规划增加的特定于任务的内存容量。
第7步:MapReduce配置
对于CDH 5.5及更高版本,我们建议仅为map和reduce任务指定堆或容器大小。 未指定的值将根据设置mapreduce.job.heap.memory-mb.ratio计算。 此计算遵循Cloudera Manager并根据比率和容器大小计算堆大小。
步骤7A:MapReduce完整性检查
完整性检查MapReduce设置对容器的最小/最大属性。
通过步骤7A,您可以一目了然地确认所有最小和最大资源分配都在您设置的参数范围内。
连续调度
启用或禁用连续调度会更改YARN连续或基于节点心跳调度的频率。 对于较大的群集(超过75个节点)看到繁重的YARN工作负载,建议通常使用以下设置禁用连续调度:
???? yarn.scheduler.fair.continuous-scheduling-enabled应为false
???? yarn.scheduler.fair.assignmultiple应该是真的
在大型群集上,连续调度可能导致ResourceManager无响应,因为连续调度会遍历群集中的所有节点。
有关连续调度调优的更多信息,请参阅以下知识库文章:FairScheduler使用assignmultiple调整和连续调度
我们没有75个节点,设置为yarn.scheduler.fair.continuous-scheduling-enabled 为true
yarn.scheduler.fair.assignmultiple = true
小结:
yarn中容器内存的计算方法
yarn.nodemanager.resource.memory-mb
容器虚拟 CPU 内核
yarn.nodemanager.resource.cpu-vcores
//这2个值是更具最后用到的资源剩下来 多少给yarn的
提示:如果yarn.nodemanager.resource.memory-mb=2G yarn.nodemanager.resource.cpu-vcores=2 4个节点那么在192.168.0.142:8088/cluster 界面上就会有 “Memory Total=8G” “ VCores Total=8”
最小容器内存
yarn.scheduler.minimum-allocation-mb = 1G //推荐值
最小容器虚拟 CPU 内核数量
yarn.scheduler.minimum-allocation-vcores = 1 //推荐值
最大容器内存
yarn.scheduler.maximum-allocation-mb = < yarn.nodemanager.resource.memory-mb
最大容器虚拟 CPU 内核数量
yarn.scheduler.maximum-allocation-vcores = < yarn.nodemanager.resource.cpu-vcores //推荐值
容器内存增量
yarn.scheduler.increment-allocation-mb = 512M
容器虚拟 CPU 内核增量
yarn.scheduler.increment-allocation-vcores = 1 //推荐值
ApplicationMaster 虚拟 CPU 内核
yarn.app.mapreduce.am.resource.cpu-vcores = 1 //推荐值
ApplicationMaster 内存
yarn.app.mapreduce.am.resource.mb = 1024M
ApplicationMaster Java 选项库
yarn.app.mapreduce.am.command-opts = -Djava.net.preferIPv4Stack=true -Xmx768m
堆与容器大小之比
mapreduce.job.heap.memory-mb.ratio = 0.8 默认
Map 任务 CPU 虚拟内核
mapreduce.map.cpu.vcores = 1
Map 任务内存
mapreduce.map.memory.mb = 1024
Map 任务 Java 选项库
mapreduce.map.java.opts = 忽视 ignored
I/O 排序内存缓冲 (MiB)
mapreduce.task.io.sort.mb = 400
Reduce 任务 CPU 虚拟内核
mapreduce.reduce.cpu.vcores = 1
Reduce 任务内存
mapreduce.reduce.memory.mb = 1024M
Reduce 任务 Java 选项库
mapreduce.reduce.java.opts 忽视
Map 任务最大堆栈 819 //是 mapreduce.map.memory.mb 0.8
Reduce 任务最大堆栈 819M //mapreduce.reduce.memory.mb 0.8
ApplicationMaster Java 最大堆栈 819.2 //这个数字是yarn.app.mapreduce.am.resource.mb * 0.8得到的
链接中,有建议的值,但是我们这是测试集群,资源很小,生产集群上具体见链接最后的建议值
参考链接:
https://www.cloudera.com/documentation/enterprise/5-13-x/topics/cdh_ig_yarn_tuning.html
CDH5性能调优 http://blog.hylstudio.cn/archives/488
以上是关于YARN 生产详解的主要内容,如果未能解决你的问题,请参考以下文章