`
zhangxiong0301
  • 浏览: 350764 次
社区版块
存档分类
最新评论

(转)YARN内存配置

 
阅读更多

问题导读
1、Yarn对MRv1的改进有哪些?
2、怎样对Yarn简单的内存配置?
3、如何理解Yarn的资源抽象container?





在这篇中,主要介绍了Yarn对MRv1的改进,以及Yarn简单的内存配置和Yarn的资源抽象container。
我么知道MRv1存在的主要问题是:在运行时,JobTracker既负责资源管理又负责任务调度,这导致了它的扩展性、资源利用率低等问题。之所以存在这样的问题,是与其最初的设计有关,如下图:
<ignore_js_op style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun;"> 

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

从上图我们可以看到,Yarn是一种统一资源管理方式,是从MRv1中的JobTracker分离出来的。这样的好处显而易见:资源共享,扩展性好等。
MRv1与Yarn的主要区别:在MRv1中,由JobTracker负责资源管理和作业控制,而Yarn中,JobTracker被分为两部分:ResourceManager(RM)和ApplicationMaster(AM)。如下图所示:
<ignore_js_op style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun;"> 

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

从上图可以看到 ,当客户向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有个比较形象的认识,首先看下图:
<ignore_js_op style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun;"> 

从上图中我们可以看到,首先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,申请方式:<memory_num,cup_num>
注: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);
复制代码

 

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


最后一句是不是有问题啊,opts的内存,应该小于对应的map或reduce的内存的大小,而不是在map和reduce之间


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


最后一句是不是有问题啊,opts的内存,应该小于对应的map或reduce的内存的大小,而不是在map和reduce之间

相关推荐

    YARN内存配置计算脚本

    一个计算yarn内存配置的python脚本yarn-util.py,该脚本有四个参数 参数 描述 -c CORES 每个节点CPU核数 -m MEMORY 每个节点内存总数(单位G) -d DISKS 每个节点的硬盘个数 -k HBASE 如果安装了Hbase则为True,...

    Yarn 内存分配管理机制及相关参数配置.

    关于Yarn内存分配与管理,主要涉及到了ResourceManage、ApplicationMatser、NodeManager这几个概念,相关的优化也要紧紧围绕着这几方面来开展。这里还有一个Container的概念,现在可以先把它理解为运行map/reduce ...

    yarn内存和CPU配置

    Yarn的内存和CPU配置宝典 ,帮助你理解并解决配置问题,优化配置

    yarn-utils.py

    计算yarn内存配置的python脚本yarn-util.py,此脚本有四个参数 参数 描述 -c CORES 每个节点CPU核数 -m MEMORY 每个节点内存总数(单位G) -d DISKS 每个节点的硬盘个数 -k HBASE 如果安装了Hbase则为True,否则为...

    23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化

    23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化 ...本文介绍在hadoop集群中,不适用默认的参数情况下,yarn的cpu和内容配置。 本文依赖是hadoop集群正常...本文分为3个部分,即概述、cpu和内存配置。

    超实用内存溢出解决方法

    超实用内存溢出解决方法,包括各种tomcat配置方法。以及注册服务前后的配置的区别

    基于YARN资源调度器的MapReduce作业数调节方法

    YARN是Hadoop的一个分布式的资源管理系统,用来提高分布式集群的内存、I/O、网络、磁盘等资源的利用率.然而,YARN的配置参数众多,要对其人工调优并获得最佳的性能费时费力.本文在现有的YARN资源调度器的基础上,...

    spark 集群环境开发部署(hadoop,yarn,zookeeper,alluxio,idea开发环境)

    个人总结的集群搭建运行事例环境文档。...有spark standalone模式 yarn模式 zookeeper的搭建 还有分布式文件系统hdfs hadoop搭建,内存式文件系统alluxio。开发环境的搭建idea for scala 的配置 ,和打包事例

    Hadoop2.6集群环境搭建(HDFS HA+YARN)

    1、笔记本4G内存 ,操作系统WIN7 (屌丝的配置) 2、工具VMware Workstation 3、虚拟机:CentOS6.4共四台 每台机器:内存512M,硬盘40G,网络适配器:NAT模式 边看边操作 (本人原创)

    heapviz:用于Chrome堆和分配配置文件的可视化工具

    它有助于诊断内存泄漏,内存分配问题和大型内存对象。 您可以在找到托管版本。 用法 生 将您的配置文件上传到heapviz,可以在heapviz.com或本地 等待配置文件进行解析和渲染。 这可能需要一些时间,尤其是对于大型...

    SPL讲解(2)--基础设计篇

    SPL运行原理 SPL作为一个数据访问平台,最终以DLL的方式体现...这两个配置文件在整个系统运行时,将一次性载入到内存,这样可以提高SPL的运行效率,所以如果这两个配置文件修改了,要IISReset或是重编译才能见到效果。

    Spark 2.0.2 Spark 2.2 中文文档 本资源为网页,不是PDF

    Spark on YARN 配置 调试应用 Spark 属性 重要提示 在一个安全的集群中运行 用 Apache Oozie 来运行应用程序 Kerberos 故障排查 Spark 配置 Spark 监控 指南 作业调度 Spark 安全 硬件配置 构建 ...

    jest-leak-fixer:有一个内存泄漏修复程序

    笑话内存泄漏修复器 灵感来自@Telokis在。 修复以下方面的泄漏: (操纵者部) 欢迎公关。 安装 yarn add --dev jest-leak-fixer 申请 通过CLI package.json { ... "scripts" : { ... "test" : "jest-...

    singular:Apache YARN 之上的高级库

    Singular 是周末在 Apache YARN 之上制作高级库的努力,这将使编写分布式应用程序变得更容易。 Java 使多线程编程变得更容易的方式。 同样,以同样的方式编写分布式程序会很好。 只需定义 - 包含您希望在其上运行...

    Cloudera Hadoop 5&amp;Hadoop高阶管理及调优课程

    1、Hadoop2.0高阶运维,包括Hadoop节点增加删除、HDFS和YARN的HA实现, HDFS Federation实现等 2、搭建本地Yum部署CDH5的重要组件和优化配置 3、Impala、Oozie和Hue的部署、使用操作及调优 4、Hadoop安全认证及授权...

    【容器系统】之大数据容器化-基于Kubernetes构建现代大数据系统.pdf

    它的特点是基于内存计算,⽀持各类资源管理平台,其中以YARN最为常 见,同时⼜与Hadoop平台集成,在集群节点以HDFS作为分布式⽂件存储系统。 我们可以先看⼀下搭建⼀个常见的Apache Spark⼤数据平台需要哪些步骤: 1...

    Spark学习笔记

    spark 可以很容易和yarn结合,直接调用HDFS、Hbase上面的数据,和hadoop结合。配置很容易。 spark发展迅猛,框架比hadoop更加灵活实用。减少了延时处理,提高性能效率实用灵活性。也可以与hadoop切实相互结合。 ...

    centos7.5分布式平台搭建.docx

    8.1. 配置tomcat的环境变量和内存设置 29 8.2. 服务自启动 30 9. Mysql 30 9.1. 离线安装 30 9.2. 在线安装 30 9.2.1. 检测系统是否自带安装mysql 30 9.2.2. 下载yum包 30 9.2.3. 安装mysql 30 9.2.4. 启动服务 30 ...

    Big Whale任务调度系统-其他

    yarn.app-white-list: Yarn应用白名单列表(列表中的应用申请的内存超过上限,不会进行告警) 5、修改:$FLINK_HOME/bin/flink,参考:flink(因flink提交任务时只能读取本地jar包,故需要在执行提交命令时从hdfs上...

    开源调度框架dolphinscheduler,2台机器上运行的任务无法立即停止,另外1台机器运行的任务可以立即停止

    dolphinscheduler分布式部署,有3个worker节点,3个master节点 ...5. 解决方案:去掉processUtils.killYarnJob逻辑(hive、spark客户端执行,只需kill 本地进程,yarn任务会自动取消) 作者:weixin_4

Global site tag (gtag.js) - Google Analytics