Yarn简单介绍及内存配置

在这篇博客中,主要介绍了Yarn对MRv1的改进,以及Yarn简单的内存配置和Yarn的资源抽象container。
我么知道MRv1存在的主要问题是:在运行时,JobTracker既负责资源管理又负责任务调度,这导致了它的扩展性、资源利用率低等问题。之所以存在这样的问题,是与其最初的设计有关,如下图:

从上图可以看到,MRv1是围绕着MapReduce进行,并没有过多地考虑以后出现的其它数据处理方式 。按着上图的设计思路,我们每开发一种数据处理方式(例如spark),都要重复实现相应的集群资源管理和数据处理。因此,Yarn就很自然的被开发出来了。
Yarn对MRv1的最大改进就是将资源管理与任务调度分离,使得各种数据处理方式能够共享资源管理,如下图所示:

从上图我们可以看到,Yarn是一种统一资源管理方式,是从MRv1中的JobTracker分离出来的。这样的好处显而易见:资源共享,扩展性好等。
MRv1与Yarn的主要区别:在MRv1中,由JobTracker负责资源管理和作业控制,而Yarn中,JobTracker被分为两部分:ResourceManager(RM)和ApplicationMaster(AM)。如下图所示:

从上图中,我们可以清晰的看到 ,对于MRv1无论是资源管理里还是任务调度都是有JobTracker来完成得。这导致了,JobTracker负荷太大不便于管理和扩展而对于Yarn,我们看可以清晰地看到资源管理和任务调度被分为了两个部分:RM和AM。
Yarn与MRv1的差异对编程的影响:我们知道,MRv1主要由三部分组成:编程模型(API)、数据处理引擎(MapTask和ReduceTask)和运行环境(JobTracker和TaskTracker);Yarn继承了MRv1的编程模型和数据处理,改变的只是运行环境,所以对编程没有什么影响。
为了更好 的说明Yarn的资源管理,首先来看下Yarn的框架,如下图所示:

从上图可以看到 ,当客户向RM提交 作业时,由AM负责向RM提出资源申请,和向NameManager(NM)提出task执行 。也就是说 在这个过程中,RM负责资源调度,AM 负责任务调度。几点重要说明:RM负责整个集群的资源管理与调度;Nodemanager(NM)负责单个节点的资源管理与调度;NM定时的通过心跳的形式与RM进行通信,报告节点的健康状态与内存使用情况;AM通过与RM交互获取资源,然后然后通过与NM交互,启动计算任务。
下面对上面的内容通过内存资源配置进行详细说明:下面对上面的内容通过内存资源配置进行详细说明:

RM的内存资源配置,主要是通过下面的两个参数进行的(这两个值是Yarn平台特性,应在yarn-sit.xml中配置好): 
yarn.scheduler.minimum-allocation-mb 
yarn.scheduler.maximum-allocation-mb
说明:单个容器可申请的最小与最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值,从这个角度看,最小值有点想操作系统中的页。最小值还有另外一种用途,计算一个节点的最大container数目注:这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。

NM的内存资源配置,主要是通过下面两个参数进行的(这两个值是Yarn平台特性,应在yarn-sit.xml中配置) :
yarn.nodemanager.resource.memory-mb
yarn.nodemanager.vmem-pmem-ratio
说明:每个节点可用的最大内存,RM中的两个值不应该超过此值。此数值可以用于计算container最大数目,即:用此值除以RM中的最小容器内存。虚拟内存率,是占task所用内存的百分比,默认值为2.1倍;注意:第一个参数是不可修改的,一旦设置,整个运行过程中不可动态修改,且该值的默认大小是8G,即使计算机内存不足8G也会按着8G内存来使用。

AM内存配置相关参数,此处以MapReduce为例进行说明(这两个值是AM特性,应在mapred-site.xml中配置),如下:
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
说明:这两个参数指定用于MapReduce的两个任务(Map and Reduce task)的内存大小,其值应该在RM中的最大最小container之间。如果没有配置则通过如下简单公式获得:
max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
一般的reduce应该是map的2倍。注:这两个值可以在应用启动时通过参数改变;

AM中其它与内存相关的参数,还有JVM相关的参数,这些参数可以通过,如下选项配置:
mapreduce.map.java.opts
mapreduce.reduce.java.opts
说明:这两个参主要是为需要运行JVM程序(java、scala等)准备的,通过这两个设置可以向JVM中传递参数的,与内存有关的是,-Xmx,-Xms等选项。此数值大小,应该在AM中的map.mb和reduce.mb之间。

我们对上面的内容进行下总结,当配置Yarn内存的时候主要是配置如下三个方面:每个Map和Reduce可用物理内存限制;对于每个任务的JVM对大小的限制;虚拟内存的限制;

下面通过一个具体错误实例,进行内存相关说明,错误如下:
Container[pid=41884,containerID=container_1405950053048_0016_01_000284] is running beyond virtual memory limits. Current usage: 314.6 MB of 2.9 GB physical memory used; 8.7 GB of 6.2 GB virtual memory used. Killing container.
配置如下:

点击(此处)折叠或打开

  1. <property>
  2.         <name>yarn.nodemanager.resource.memory-mb</name>
  3.         <value>100000</value>
  4.     </property>
  5.     <property>
  6.         <name>yarn.scheduler.maximum-allocation-mb</name>
  7.         <value>10000</value>
  8.     </property>
  9.     <property>
  10.         <name>yarn.scheduler.minimum-allocation-mb</name>
  11.         <value>3000</value>
  12.     </property>
  13.    <property>
  14.         <name>mapreduce.reduce.memory.mb</name>
  15.         <value>2000</value>
  16.     </property>
通过配置我们看到,容器的最小内存和最大内存分别为:3000m和10000m,而reduce设置的默认值小于2000m,map没有设置,所以两个值均为3000m,也就是log中的“2.9 GB physical 
memory used”。而由于使用了默认虚拟内存率(也就是2.1倍),所以对于Map Task和Reduce Task总的虚拟内存为都为3000*2.1=6.2G。而应用的虚拟内存超过了这个数值,故报错 。解决办
法:在启动Yarn是调节虚拟内存率或者应用运行时调节内存大小。

在上Yarn的框架管理中,无论是AM从RM申请资源,还是NM管理自己所在节点的资源,都是通过container进行的。Container是Yarn的资源抽象,此处的资源包括内存和cup等。下面对
container,进行比较详细的介绍。为了是大家对container有个比较形象的认识,首先看下图:


从上图中我们可以看到,首先AM通过请求包ResourceRequest从RM申请资源,当获取到资源后,AM对其进行封装,封装成ContainerLaunchContext对象,通过这个对象,AM与NM进行通讯,
以便启动该任务。下面通过ResourceRequest、container和ContainerLaunchContext的protocol buffs定义,对其进行具体分析。

ResourceRequest结构如下:

点击(此处)折叠或打开

  1. message ResourceRequestProto {
  2. optional PriorityProto priority = 1; // 资源优先级
  3. optional string resource_name = 2; // 期望资源所在的host
  4. optional ResourceProto capability = 3; // 资源量(mem、cpu)
  5. optional int32 num_containers = 4; // 满足条件container个数
  6. optional bool relax_locality = 5 ; //default = true; 
  7. }
对上面结构进行简要按序号说明:
2:在提交申请时,期望从哪台主机上获得,但最终还是AM与RM协商决定;
3:只包含两种资源,即:内存和cpu,申请方式:
注:1、由于2与4并没有限制资源申请量,则AP在资源申请上是无限的。2、Yarn采用覆盖式资源申请方式,即:AM每次发出的资源请求会覆盖掉之前在同一节点且优先级相同的资源请求,
也就是说同一节点中相同优先级的资源请求只能有一个。

container结构:

点击(此处)折叠或打开

  1. message ContainerProto {
  2. optional ContainerIdProto id = 1; //container id
  3. optional NodeIdProto nodeId = 2; //container(资源)所在节点
  4. optional string node_http_address = 3;
  5. optional ResourceProto resource = 4; //分配的container数量
  6. optional PriorityProto priority = 5; //container的优先级
  7. optional hadoop.common.TokenProto container_token = 6; //container token,用于安全认证
  8. }
注:每个container一般可以运行一个任务,当AM收到多个container时,将进一步分给某个人物。如:MapReduce

ContainerLaunchContext结构:

点击(此处)折叠或打开

  1. message ContainerLaunchContextProto {
  2. repeated StringLocalResourceMapProto localResources = 1; //该Container运行的程序所需的在资源,例如:jar包
  3. optional bytes tokens = 2;//Security模式下的SecurityTokens
  4. repeated StringBytesMapProto service_data = 3;
  5. repeated StringStringMapProto environment = 4; //Container启动所需的环境变量
  6. repeated string command = 5; //该Container所运行程序的命令,比如运行的为java程序,即$JAVA_HOME/bin/java org.ourclassrepeated ApplicationACLMapProto application_ACLs = 6;//该Container所属的Application的访问
  7. 控制列表
  8. }
下面结合一段代码,仅以ContainerLaunchContext为例进行描述(本应该写个简单的有限状态机的,便于大家理解,但时间不怎么充分):

点击(此处)折叠或打开

  1. 申请一个新的ContainerLaunchContext:
  2. ContainerLaunchContext ctx = Records.newRecord(ContainerLaunchContext.class);
  3.           填写必要的信息:
  4. ctx.setEnvironment(...);
  5. childRsrc.setResource(...);
  6. ctx.setLocalResources(...);
  7. ctx.setCommands(...);
  8. 启动任务:
  9. startReq.setContainerLaunchContext(ctx);

最后对container进行如下总结:container是Yarn的资源抽象,封装了节点上的一些资源,主要是CPU与内存;container是AM向NM申请的,其运行是由AM向资源所在NM发起的,并最终运行

的。有两类container:一类是AM运行需要的container;另一类是AP为执行任务向RM申请的。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql计算时间函数_mysql时间计算函数

当前一个业务需求&#xff0c;需要查找创建在三天以前的数据&#xff0c;表中是存了一个创建时间的&#xff1b;这个需求看起来很简单&#xff0c;直接全部查找出来然后用代码根据时间筛选一下就可以了。但这只是适用于数据量不大的情况下&#xff0c;如果数据量大&#xff0c;…

html上传文件_.NET基于WebUploader大文件分片上传、断网续传、秒传

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;学习中的苦与乐cnblogs.com/xiongze520/p/10412693.html现在的项目开发基本上都用到了上传文件功能&#xff0c;或图片&#xff0c;或文档&#xff0c;或视频。我们常用的常规上传已经能够满足当前要求了&#xff0c;…

Hadoop运行任务时一直卡在: INFO mapreduce.Job: Running job

原文链接&#xff1a;http://blog.csdn.net/dai451954706/article/details/50464036 ----------------------------------------------------------------------------------------------------- 今天&#xff0c;一大清早同事就让我帮他解决Hive的问题&#xff1a;他在Hive中…

git切换用户密码_Git 最基本的命令

本人比较懒&#xff0c;不是很爱学习新东西&#xff0c;之前用Git一直在用GUI SourceTree&#xff0c;今天因为用到Cloud IDEGitHub才迫不得已用一下Git的命令行&#xff0c;如果你是Git的新手&#xff0c;也分享给你最基本的命令。新建一个Git版本库把一个本地文件夹变成一个G…

动态分区装载数据

不开启 一个个分区导入&#xff0c;分区需要做到一对一。 hive (zmgdb)> insert overwrite table p_t3 partition (cityningbo) > select name,post,address from p_t1 where cityningbo; 会启动mapreduce进行导入&#xff0c;mr卡在kill job_xxxx&#…

AI造福设计师:搭配色板这种苦差事交给GAN就好啦(教程)

本文来自AI新媒体量子位&#xff08;QbitAI&#xff09;设计师要开工&#xff0c;总是离不开配色方案&#xff0c;也就是色板。 不过&#xff0c;做色板可不是个简单的活&#xff0c;色板生成器Colormind的作者Jack Qiao&#xff08;名字来自Product Hunt&#xff0c;我们下面叫…

mapreduce yarn内存参数

1、yarn-site.xml 设置 1.1 RM设置 RM的内存资源配置&#xff0c;主要是通过下面的两个参数进行的&#xff08;这两个值是Yarn平台特性&#xff0c;应在yarn-sit.xml中配置好&#xff09;&#xff1a; yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocati…

html网页设计大赛_HTML5网页设计大赛 || 决赛名单公布

历经数日的HTML5网页设计大赛初赛已经落下的帷幕激动人心的决赛即将开始你们准备好了吗&#xff1f;①决赛名单在经过评委老师多轮评选后,有以下队伍/(个人)脱颖而出进入决赛&#xff1a;1.施佳镛_故宫旅游网2.王永校_神秘莫测的宇宙3.黄炜岳_广州旅游网站4.吴贵滨_NameLess5.陈…

Hive的数据模型—桶表

概述 桶表是对数据进行哈希取值&#xff0c;然后放到不同文件中存储。 数据加载到桶表时&#xff0c;会对字段取hash值&#xff0c;然后与桶的数量取模。把数据放到对应的文件中。 物理上&#xff0c;每个桶就是表(或分区&#xff09;目录里的一个文件&#xff0c;一个作业产…

delphi bmp绘制矢量文件效率慢_聊一聊矢量瓦片的常识

一、矢量瓦片的基本原理和相关格式现阶段&#xff0c;电子地图瓦片主要使用两种方式&#xff0c;一种是传统的栅格瓦片&#xff0c;另外一种是新出的矢量瓦片(Vector Tiles)&#xff0c;前者是采用四叉树金字塔模型的分级方式&#xff0c;将地图切割成无数大小相等的矩形栅格图…

python生成器与迭代器。

生成器 在python 中一边循环一边计算的机制&#xff0c;叫做生成器(generator)。 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;收到内存的限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用…

python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary

原标题&#xff1a;在python 中如何将 list 转化成 dictionary 问题1&#xff1a;如何将一个list转化成一个dictionary&#xff1f; 问题描述&#xff1a;比如在python中我有一个如下的list&#xff0c;其中奇数位置对应字典的key&#xff0c;偶数位置为相应的value解决方案: 1…

vscode gcc debug dbg gdb c cpp c++ cuckoo monitor

为什么80%的码农都做不了架构师&#xff1f;>>> 装cygwin 或者mingGW&#xff0c;装gcc工具链&#xff0c;并将cygwin的bin目录加入环境变量PATH中。 ctrlshiftb {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the tasks…

python爬取知网论文关键词_Python爬虫根据关键词爬取知网论文摘要并保存到数据库中...

由于实验室需要一些语料做研究&#xff0c;语料要求是知网上的论文摘要&#xff0c;但是目前最新版的知网爬起来有些麻烦&#xff0c;所以我利用的是知网的另外一个搜索接口 搜索出来的结果和知网上的结果几乎一样 在这个基础上&#xff0c;我简单看了些网页的结构&#xff0c;…

网页中查看pdf文档

2019独角兽企业重金招聘Python工程师标准>>> 介绍&#xff1a; PDFObject 是一个 JavaScript 库&#xff0c;用来在HTML中动态嵌入 PDF 文档。 实现代码&#xff1a; <script type"text/javascript" src"pdfobject.js"></script>…

python opencv 读取视频流不解码_python + opencv: 解决不能读取视频的问题

博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像&#xff0c;程序如下&#xff1a; cap cv2.VideoCapture(0) ret, frame cap.read()使用这个程序能够打开摄像头并获取图像&#xff0c;一切正常。 接着想使用OpenCv播放视频&#xff0c;按照官方教程只要将VideoCaptu…

jmeter提取mysql返回值_jmeter连接数据库和提取数据库返回值

一、在MySQL命令行中&#xff0c;验证MySQL是否能正常登陆。若不能登陆&#xff0c;则重置MySQL的密码。二、下载mysql-connector-java-5.1.45-bin.jar&#xff0c;将其放入Jmeter安装目录的lib目录下。完成MySQL数据库的驱动。三、右键“线程组”->“配置元件”->“JDBC…

用python画雨滴_Python编程从入门到实践练习(雨滴)

雨滴&#xff1a;寻找一幅雨滴图像&#xff0c;并创建一系列整齐排列的雨滴。让这些雨滴往下落&#xff0c;直到到达屏幕后消失。 先说今天的问题&#xff1a; 1.在更改函数形参时&#xff0c;调用的时候也要修改&#xff0c;否则会出现AttributeError 值得注意的是&#xff1a…

Hive文件格式

Hive有四种文件格式&#xff1a;TextFile&#xff0c;SequenceFile&#xff0c;RCFile&#xff0c;ORC TextFile 默认的格式&#xff0c;文本格式。 SequenceFile 简介 见&#xff1a;http://blog.csdn.net/zengmingen/article/details/52242768 操作 hive (zmgdb)>cre…

learnpythonthehardway下载_Python【十一】:阶段小结

今天来将前一段时间学习的Python的知识系统地梳理一遍&#xff0c;接下来开始实际的编程实践了。 一、Python实验环境搭建 使用Python编程&#xff0c;首先要有一个开发环境&#xff0c;如同C/C上又VS2008家族一样&#xff0c;Linux/MacOS上的部署情况这里不再详述&#xff0c;…