当前位置: 首页>>hadoop 2.0之YARN>> 阅读正文

Hadoop MapReduce两种常见的容错场景分析

Category: hadoop 2.0之YARN View: 8,831 Author: Dong
, , ,

  • 评论 (4)
  • 引用通告 (0)
发表评论 发起引用

  • 1楼zz 回复

    Post: 2013-12-05 01:28

    董大神,您好!在hadoop2.2也有个常见错误。输入60G的数据做waordcount(example)时,yarn在运行shuffle阶段时,container 的物理内存溢出。
    后来通过调整mapreduce.reduce.java.opts=-Xmx5000m 任务才执行通过。也就是说shuffle要4G内存。
    调整一下参数
    mapreduce.reduce.shuffle.merge.percent=0.4
    mapreduce.reduce.shuffle.parallelcopies=5
    mapreduce.reduce.shuffle.input.buffer.percent=0.6
    mapreduce.reduce.shuffle.memory.limit.percent=0.17
    shuffle任然要4G内存。感觉shuffle.memory.limit.percent没有起到作用。是不是bug啊?或者您碰到过嘛? 谢谢您的回复

    [回复]

    Dong 回复:

    不是bug,是你使用不当,取决于报错情况,如果是物理内存溢出,需要调整mapreduce.reduce.memory.mb参数,默认是1024,如果是虚拟内存溢出,需要调整yarn.nodemanager.vmem-pmem-ratio,默认是2.1,调大即可,或者直接不限制虚拟内存,即yarn.nodemanager.vmem-check-enabled置为false(在yarn-site.xml中,默认是true),物理内存也可以不检查,将yarn.nodemanager.pmem-check-enabled置为false(默认是true)。

    [回复]

    zz 回复:

    mapreduce.reduce.java.opts=-Xmx5000m代表reduce最大堆内存5000M,mapreduce.reduce.memory.mb要大于java.opts,代表reduce最大内存,我设置的是5120M。yarn.nodemanager.vmem-pmem-ratio用的是默认2.1。
    我的意思是在shuffle阶段不该使用那么多内存。我调整shuffle参数,并没有把shuffle的内存降下来。同样的数据在1.0上shuffle内存就1G。 10个mapred并发在1.0上没问题,在2.2上直接卡住不动了,是永远不往下执行了。

    [回复]

    Dong 回复:

    shuffle不会用很多内存。另外,Hadoop 2.0中的Map Task和Reduce Task与1.0基本一致,代码基本算是重用,shuffle流程基本一致,而且wordcount这是经典的例子,通常不应该存在这种问题。能否说一下你测试的数据量和数据特征,reduce task个数,每个reduce输入数据量,每个key/value长度,我分析一下。有些极个别特性下的数据集,会出现你所说的情况,但极少碰到。

    [回复]

    zz 回复:

    您好!你的书(yarn)已经到手了。单词是随机生成的,不会有问题。我跑了480个map(每个输入128m),可是reduce默认只有1个,我设置3~6个内存还是很大。有没有办法让reduce个数根据map数智能生成啊?这样应该可以减少内存。reduce是自己智能生成,而不是我人为1个个mapred设置。谢谢

    [回复]

    Dong 回复:

    调大reduce task个数,比如调整200, 一个reduce task,那台机器会爆掉的。

    [回复]

    zz 回复:

    默认就是1个,这样我就需要去对每个mapred去设置。hive会智能配置reduce个数,同样的数据hive表的sql会生成11个reduce。有没有参数让reduce根据map个数去智能生成。

    [回复]

    Dong 回复:

    智能也是相对的,很多情况下不“智能”,在hive中,也可以设置。有时候,为了让作业运行的更好,就需要定制一些参数,已覆盖掉默认值。

    [回复]

  • 2楼Hadoop User 回复

    Post: 2013-12-06 01:49

    董老师,你好,请教一个问题。我编写了Mapreduce V2程序,运行在集群上,每次处理100G左右的数据,但是程序一运行,CPU使用率会达到100%,直到任务结束,内存使用不会达到最大。在NodeMangager机器上,使用jps命令查看,会发现有8个YarnChild进程,是否可以通过更改配置文件来减少YarnChild进程数量,来达到减少CPU占用。
    集群机器总共有5台,配置为I5四核,内存16G

    [回复]

    Dong 回复:

    有几种方法,一种是使用多租户资源调度器,比如fairscheduler,capacity scheduler,配置多类型资源调度功能,这样,你可以使用参数mapreduce.map.cpu.vcores和mapreduce.reduce.cpu.vcores指定每个任务使用的CPU数目,默认是1个,另外,默认只支持内存调度,你可以通过参数mapreduce.map.memory.mb和mapreduce.reduce.memory.mb增大任务的内存使用量,减少一个节点上的并发任务数目。

    [回复]

  • 3楼胜者为王 回复

    Post: 2013-12-11 01:00

    董老师,noFailedFetched取值范范围是否是[0,Max(10,numMaps/10))?

    [回复]

    Dong 回复:

    对于一个job,是固定值,计算方法是 max(10,numMaps/10),比如map数目小于100,则是10,如果大于100,比如200,则是20

    [回复]

  • 4楼lq不是我 回复

    Post: 2014-03-14 17:21

    董老师,你好,请教一个问题。我自己编写了一个mapper程序,没有reudce。我在map程序里创建了一个临时目录来存放map结果文件。结果发现临时目录跟输出文件时由不同的用户创建的。map的输出结果属于3个用户(mapred,yarn,ganglia)。我想不明白为什么会是不同的用户在执行mapper程序呢?

    [回复]

目前还没有任何Trackbacks和Pingbacks.
发表评论