zoukankan      html  css  js  c++  java
  • mapreduce 内存分配

    稍微有点mapreduce使用经验的同学肯定对OOM不陌生,对的,我目前在mapReduce里面遇到的最多的报错也是内存分配出错,所以看到好多hadoop执行脚本里面有好多关于内存的参数,虽然是知道和内存分配有关系,但是我依然不太清楚具体的原理,从网上查阅相关资料,看到博主整理的,甚是欣慰,稍作整理如下:

    关于mapreduce程序运行在yarn上时内存的分配一直是一个让我蒙圈的事情,单独查任何一个资料都不能很好的理解透彻。于是,最近查了大量的资料,综合各种解释,终于理解到了一个比较清晰的程度,在这里将理解的东西做一个简单的记录,以备忘却。
    首先,先将关于mapreduce和yarn关于内存分配的参数粘贴上:

        yarn.scheduler.minimum-allocation-mb
        yarn.scheduler.maximum-allocation-mb
        yarn.nodemanager.resource.memory-mb
        yarn.nodemanager.vmem-pmem-ratio
        yarn.scheduler.increment-allocation-mb
        mapreduce.map.memory.mb
        mapreduce.reduce.memory.mb
        mapreduce.map.java.opts
        mapreduce.reduce.java.opts

    个人认为,针对mapreduce任务,这些参数只有放在一起学习才能真正理解,如果单独考虑,理解不清晰。下面开始详细讲解。
    一、理解参数yarn.nodemanager.resource.memory-mb,yarn.nodemanager.vmem-pmem-ratio

    yarn.nodemanager.resource.memory-mb很简单,就是你的这台服务器节点上准备分给yarn的内存;
    yarn.nodemanager.vmem-pmem-ratio网上解释都是”每使用1MB物理内存,最多可用的虚拟内存数,默认2.1”,但是目前我还是不太理解其作用是什么,有知道的朋友希望能详细解释下。
    二、理解参数yarn.scheduler.minimum-allocation-mb和yarn.scheduler.maximum-allocation-mb

    都知道,在yarn上运行程序时每个task都是在独立的Container中运行的,单个Container可以申请的最小和最大内存的限制就是这两个参数,注意,并不是这两个参数决定单个Container申请内存的大小,而仅仅是限制的一个范围。
    三、理解yarn的内存规整化因子和内存规整化算法

    先不说和哪个参数有关,单纯理解这一概念。举例:
    假如规整化因子b=512M,上述讲的参数yarn.scheduler.minimum-allocation-mb为1024,yarn.scheduler.maximum-allocation-mb为8096,然后我打算给单个map任务申请内存资源(mapreduce.map.memory.mb):
    申请的资源为a=1000M时,实际得到的Container内存大小为1024M(小于yarn.scheduler.minimum-allocation-mb的话自动设置为yarn.scheduler.minimum-allocation-mb);
    申请的资源为a=1500M时,实际得到的Container内存大小为1536M,计算公式为:ceiling(a/b)*b,即ceiling(a/b)=ceiling(1500/512)=3,3*512=1536。此处假如b=1024,则Container实际内存大小为2048M
    也就是说Container实际内存大小最小为yarn.scheduler.minimum-allocation-mb值,然后增加时的最小增加量为规整化因子b,最大不超过yarn.scheduler.maximum-allocation-mb
    四、理解mapreduce.map.memory.mb、mapreduce.reduce.memory.mb

    “三”中提到的”打算给单个map任务申请内存资源”也就是a,其实就是指的”mapreduce.map.memory.mb”或”mapreduce.reduce.memory.mb”,注意其值不要超过yarn.scheduler.maximum-allocation-mb
    五、理解mapreduce.map.java.opts、mapreduce.reduce.java.opts

    以map任务为例,Container其实就是在执行一个脚本文件,而脚本文件中,会执行一个 Java 的子进程,这个子进程就是真正的 Map Task,mapreduce.map.java.opts 其实就是启动 JVM 虚拟机时,传递给虚拟机的启动参数,而默认值 -Xmx200m 表示这个 Java 程序可以使用的最大堆内存数,一旦超过这个大小,JVM 就会抛出 Out of Memory 异常,并终止进程。而 mapreduce.map.memory.mb 设置的是 Container 的内存上限,这个参数由 NodeManager 读取并进行控制,当 Container 的内存大小超过了这个参数值,NodeManager 会负责 kill 掉 Container。在后面分析 yarn.nodemanager.vmem-pmem-ratio 这个参数的时候,会讲解 NodeManager 监控 Container 内存(包括虚拟内存和物理内存)及 kill 掉 Container 的过程。
    也就是说,mapreduce.map.java.opts一定要小于mapreduce.map.memory.mb
    mapreduce.reduce.java.opts同mapreduce.map.java.opts一样的道理。
    六、理解规整化因子指的是哪个参数

    “三”中提到的规整化因子也就是b,具体指的是哪个参数和yarn使用的调度器有关,一共有三种调度器:capacity scheduler(默认调度器)、fair scheduler和fifo scheduler
    当使用capacity scheduler或者fifo scheduler时,规整化因子指的就是参数yarn.scheduler.minimum-allocation-mb,不能单独配置,即yarn.scheduler.increment-allocation-mb无作用;
    当使用fair scheduler时,规整化因子指的是参数yarn.scheduler.increment-allocation-mb
    至此,关于yarn和mapreduce的任务内存配置问题讲完了,这也是我目前理解的层次。

    MapReduce优化
    优化(1)资源相关参数:
    以下参数是在自己的 MapReduce 应用程序中配置就可以生效

    mapreduce.map.memory.mb: 一个 Map Task 可使用的内存上限(单位:MB),默认为 1024。如果 Map Task 实际使用的资源量超过该值,则会被强制杀死。
    mapreduce.reduce.memory.mb: 一个 Reduce Task 可使用的资源上限(单位:MB),默认为 1024。如果 Reduce Task 实际使用的资源量超过该值,则会被强制杀死。
    mapreduce.map.cpu.vcores: 每个 Maptask 可用的最多 cpu core 数目, 默认值: 1
    mapreduce.reduce.cpu.vcores: 每个 Reducetask 可用最多 cpu core 数目默认值: 1
    mapreduce.map.java.opts: Map Task 的 JVM 参数,你可以在此配置默认的 java heap size 等参数, 例如:“-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc”
    (@taskid@会被 Hadoop 框架自动换为相应的 taskid), 默认值: “”
    mapreduce.reduce.java.opts: Reduce Task 的 JVM 参数,你可以在此配置默认的 java heap size 等参数, 例如:“-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc”, 默认值: “”
    应该在 yarn 启动之前就配置在服务器的配置文件中才能生效

    yarn.scheduler.minimum-allocation-mb RM 中每个容器请求的最小配置,以 MB 为单位,默认 1024。
    yarn.scheduler.maximum-allocation-mb RM 中每个容器请求的最大分配,以 MB 为单位,默认 8192。
    yarn.scheduler.minimum-allocation-vcores 1
    yarn.scheduler.maximum-allocation-vcores 32
    yarn.nodemanager.resource.memory-mb 表示该节点上YARN可使用的物理内存总量,默认是 8192(MB),注意,如果你的节点内存资源不够 8GB,则需要调减小这个值,而 YARN不会智能的探测节点的物理内存总量。
    shuffle 性能优化的关键参数,应在 yarn 启动之前就配置好

    mapreduce.task.io.sort.mb 100 shuffle 的环形缓冲区大小,默认 100m
    mapreduce.map.sort.spill.percent 0.8 环形缓冲区溢出的阈值,默认 80%

    优化(2)容错相关参数:
    mapreduce.map.maxattempts: 每个 Map Task 最大重试次数,一旦重试参数超过该值,则认为 Map Task 运行失败,默认值:4。

    mapreduce.reduce.maxattempts: 每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为 Map Task 运行失败,默认值:4。

    mapreduce.map.failures.maxpercent: 当失败的 Map Task 失败比例超过该值,整个作业则失败,默认值为 0. 如果你的应用程序允许丢弃部分输入数据,则该该值设为一个大于 0 的值,比如 5,表示如果有低于 5%的 Map Task 失败(如果一个 Map Task 重试次数超过mapreduce.map.maxattempts,则认为这个 Map Task 失败,其对应的输入数据将不会产生任何结果),整个作业扔认为成功。

    mapreduce.reduce.failures.maxpercent: 当失败的 Reduce Task 失败比例超过该值为,整个作业则失败,默认值为 0.

    mapreduce.task.timeout:如果一个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该 task 处于 block 状态,可能是临时卡住,也许永远会卡住。为了防止因为用户程序永远 block 不退出,则强制设置了一个超时时间(单位毫秒),默认是600000,值为 0 将禁用超时。

    优化(3)效率跟稳定性参数(任务的推测执行):
    Straggle(掉队者)是指那些跑的很慢但最终会成功完成的任务。一个掉队的Map任务会阻止Reduce任务开始执行。

    Hadoop不能自动纠正掉队任务,但是可以识别那些跑的比较慢的任务,然后它会产生另一个等效的任务作为备份,并使用首先完成的那个任务的结果,此时另外一个任务则会被要求停止执行。这种技术称为推测执行(speculative execution)。

    默认使用推测执行。
    属性                                                                                           描述
    mapreduce.map.speculative                                                     控制Map任务的推测执行(默认true)
    mapreduce.reduce.speculative                                                 控制Reduce任务的推测执行(默认true)
    mapreduce.job.speculative.speculativecap                              推测执行功能的任务能够占总任务数量的比例(默认0.1,范围0~1)
    mapreduce.job.speculative.slownodethreshold                        判断某个TaskTracker是否适合启动某个task的speculative task(默认1)
    mapreduce.job.speculative.slowtaskthreshold                         判断某个task是否可以启动speculative task(默认1)
    mapreduce.input.fileinputformat.split.minsize                          FileInputFormat做切片时最小切片大小,默认 1。

    mapreduce.input.fileinputformat.split.maxsize                         FileInputFormat做切片时最大切片大小

  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/wcgstudy/p/10788193.html
Copyright © 2011-2022 走看看