在这篇博客中,主要介绍了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申请的。

Yarn简单介绍及内存配置相关推荐

  1. HCNA——RIP简单介绍及基本配置

    HCNA--RIP简单介绍及基本配置 路由信息协议RIP 路由信息协议RIP(Routing Information Protocol)的简称,它是一种基于距离矢量(Distance-Vector)算 ...

  2. Spacevim简单介绍及个人配置总结

    Spacevim简单介绍及个人配置总结 文章目录 Spacevim简单介绍及个人配置总结 1. 前言 2. Spacevim开源地址和入门指南 3. 个人简单的配置总结 1. 修改配置的位置 2. 去 ...

  3. stm32 GPIO简单介绍及初始化配置(库函数)

    前言: 相信,大部分查找GPIO的人,都是刚刚接触STM32的人,而刚接触STM32的人,大部分是从51上来的人,所以我会由浅入深,从51和STM32的区别入手,通过对比这两个处理器的配置方法,来跟大 ...

  4. 内存数据网格IMDG简单介绍

    1 简单介绍 将内存作为首要存储介质不是什么新奇事儿,我们身边有非常多主存数据库(IMDB或MMDB)的样例. 在对主存的使用上,内存数据网格(In Memory Data Grid.IMDG)与IM ...

  5. Flink部署——内存配置

    文章目录 配置 Flink 进程的内存 配置总内存 JVM 参数 受限的等比内存部分 配置 TaskManager 内存 配置总内存 配置堆内存和托管内存 任务(算子)堆内存(Task (Operat ...

  6. dell服务器清空系统空间,PowerEdge 服务器上的内存配置错误。

    本文介绍常见内存配置错误及其解决方法. 常见错误表 128 位高级 ECC 模式处于禁用状态.对于 128 位高级 ECC,必须成对安装 DIMM.DIMM 对必须在大小和几何形状上匹配. 原因: 已 ...

  7. CCNA课堂练习二:路由协议EIGRP简单介绍与配置

    EIGRP协议是Cisco的私有路由协议,它综合了距离矢量和链路状态2者的优点.它的英文全称是"Enhanced Interior Gateway Routing Protocol" ...

  8. JSTL 及 tablibs 的简单介绍和配置方法

    JSTL 及 tablibs 的简单介绍和配置方法 jstl 简介 jstl 的全称就是jsp standard tag libraries, 就是jsp里的标准标签库. 引用jstl技术能在jsp种 ...

  9. 手工计算YARN和MapReduce、tez内存配置设置

    1.1.HDP YARN MapReduce参数调优建议 转自:https://blog.csdn.net/mnasd/article/details/81202908 1.1.1.RM的内存资源配置 ...

最新文章

  1. mysql主从结构主数据库_mysql主从结构主数据库
  2. 读取xml忽略dtd验证
  3. C语言 | 编写一个使用指针的c函数,交换数组a和数组b中的对应元素
  4. Power Bi:零售数据可视化
  5. jQuery遍历,数组,集合
  6. 分页池内存持续增长_鸿蒙内核源码分析(从进程/线程视角看内存)
  7. 云计算仿真框架CloudSim介绍
  8. Android 相对布局常用属性
  9. 敏捷个人A2组第一次讨论纪要 如何让别人乐于帮助你?
  10. html中给select下拉框赋值
  11. Android常用浏览器,常用六款经典Android平台浏览器推荐
  12. dns污染怎么快速清除解决
  13. 猜大小(python)
  14. 解决异常 Data truncation: Incorrect datetime value: '' for column 'ordertime'
  15. 2.5万字详细讲解个人网站的开发过程和项目的部署
  16. 用cygwin从本地向ubuntu某路径下传文件时Permission denied解决方法
  17. html下拉菜单自动收回,jquery使用hover触发下拉菜单如果为什么有空隙就自动收回?...
  18. 万拓存储数字校园存储解决方案
  19. MongoDB Aggregation pipelines(聚合管道)之 $lookup
  20. Spirng的IOC

热门文章

  1. linux更改语言脚本,Linux shell脚本入门——shell语言脚本【CentOS】
  2. mysql用户信息备份还原_mysql迁移之新建用户、备份还原数据库
  3. 【Java中级篇】使用itextpdf生成PDF
  4. Floyd算法的理解
  5. string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...
  6. linux系统可以用迅雷吗,在Linux系统下使用wine运行迅雷5的方法
  7. mysql联合子查询_2020-09-08MySQL多表联合查询之子查询
  8. Java线程怎么发送消息_Java客户端Socket如何能在阻塞线程下收到服务端发送来的消息?...
  9. java 类 属性数量_跟我学java编程—Java类的属性与成员变量
  10. linux同时安装python2和python3_linux-Centos7安装python3并与python2共存