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

(转)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内存分配的管理机制以及相关参数配置。 首先,YARN内存管理涉及到三个主要角色:ResourceManager(RM)、ApplicationMaster(AM)和NodeManager(NM)。 1. ResourceManager(RM):RM是全局...

    yarn内存和CPU配置

    ### YARN内存与CPU配置详解 #### 一、引言 Apache Hadoop YARN(Yet Another Resource Negotiator)作为新一代的资源管理和任务调度框架,在大数据处理领域占据着重要的地位。YARN不仅支持内存资源的调度,还支持...

    yarn-utils.py

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

    hadoop yarn优化配置项生成工具

    这里提到的"hadop yarn优化配置项生成工具"是一个实用的脚本工具,用于根据特定的硬件环境和工作负载生成优化的YARN配置参数。这个工具基于Python编写,名为`yarn-utils.py`。 要使用这个工具,首先确保你的系统...

    java提交spark任务到yarn平台的配置讲解共9页.pdf.zip

    在提交Spark任务前,需要配置Spark的相关属性,如`spark.master`设置为`yarn-client`或`yarn-cluster`,前者用于客户端模式,后者用于集群模式。此外,还需指定Hadoop的配置目录,例如`spark.yarn.conf.archive`。 ...

    Spark实验:On Yarn模式安装部署(带答案)1

    3. **配置yarn-site.xml**:为了防止YARN因内存限制而终止Spark任务,我们需要在`yarn-site.xml`中取消内存检查。这可以通过设置两个属性`yarn.nodemanager.pmem-check-enabled`和`yarn.nodemanager.vmem-check-...

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

    在Hadoop集群中,YARN(Yet Another Resource Negotiator)作为资源管理器,负责调度MapReduce任务的内存和CPU资源。YARN支持基于内存和CPU的两种资源调度策略,以确保集群资源的有效利用。在非默认配置下,合理地...

    Spark on Yarn之Executor内存管理 - 简书1

    总结来说,Spark on YARN的Executor内存管理是一个复杂的过程,需要综合考虑Executor的内存需求、YARN的资源配置以及Spark自身的内存策略。正确配置和优化这些参数对于确保Spark应用的稳定运行至关重要。

    Yarn常见问题维护手册V1.01

    除了调整内存配置,还可以优化代码,减少内存消耗,或者考虑使用更高效的算法。 - `[YARN-20003]` 集群资源足够时,大量任务处于 Accepted 状态:这可能是由于调度策略或队列设置问题。检查 RM 的调度器配置,如...

    yarn.tar.gz

    此外,你还需要掌握YARN的配置,如在`yarn-site.xml`中设置的参数,以及如何通过命令行接口与YARN交互,如提交应用程序、查看应用程序状态等。同时,了解YARN与MapReduce、Spark等计算框架的集成也是很重要的。 总...

    YARN学习书籍及注解

    通过深入学习"YARN学习书籍及注解",读者可以全面了解YARN的工作原理,掌握如何配置和管理YARN集群,以及如何针对特定应用场景进行优化,这对于从事大数据处理和分析的工程师来说是非常宝贵的技能。

    YARN Essentials.PDF

    - **容器配置:** 可以通过配置文件来设置容器的最大内存、CPU 核心数等参数。 **2. 调度策略配置:** - **FIFO 调度器配置:** 设置默认的调度策略为 FIFO。 - **容量调度器配置:** 定义队列及其优先级、最大资源...

    java提交spark任务到yarn平台的配置讲解共9页

    3. Hadoop配置:确保`hadoop.conf.dir`环境变量指向了Hadoop的配置目录,这样Spark才能找到YARN的相关配置。 四、打包和提交 1. 打包应用:使用Maven或Gradle将Java项目打包成jar文件,例如`my-spark-job.jar`。 2...

    yarn架构与讲解

    在MapReduce作业中,合理配置参数对提升作业性能至关重要。以下是一些关键的设置参数: - **mapreduce.map.sort.spill.percent**:指定溢写阈值,即何时将数据从内存溢写到磁盘。 - **mapreduce.job.reduces**:...

    jdk1.8+yarn-1.22.10.tar.gz

    接着,需要更新Hadoop配置文件(如`yarn-site.xml`和`core-site.xml`),配置YARN的相关参数,如内存和CPU的分配策略。最后,启动YARN服务,确保所有节点都能正常通信。 总之,JDK 1.8和YARN 1.22.10的结合,为基于...

    Yarn的操作.pdf

    YARN操作需要我们了解ResourceManager页面的资源信息、SparkSubmit命令中的资源相关参数、Spark任务的并行度和SparkSQL任务的配置等知识点。只有掌握了这些知识点,我们才能更好地使用YARN和Spark,提高我们的工作...

    董西成:Hadoop YARN程序设计与应用案例

    - **Container**:在NodeManager管理下的资源抽象,它封装了某个节点上的多维资源(例如CPU、内存等),是执行任务的基本单位。 ### YARN API与开发步骤 在进行Hadoop YARN程序设计时,主要涉及三个通信协议: 1. *...

Global site tag (gtag.js) - Google Analytics