一 常见容错场景分析

1.1作业某个任务阻塞了,长时间占用资源不释放

1.2在MapTask任务运行完毕,ReduceTask运行过程中,某个MapTask节点挂了,或者某个MapTask结果存放的那磁盘坏掉了

二 作业某个任务阻塞了,长时间占用资源不释放

这种问题通常是由于程序bug,数据特性造成的,会让程序阻塞,任务运行停滞不前。在我们表面上看来是任务停滞不前。

这种问题经常发生,任务长时间占用着资源不释放,如果不采取一定手段,可能会永远被占用,造成资源泄露。

在TaskTracker,每个任务会定期向TaskTracker汇报进度,如果进度不变则不汇报,这样一旦达到超时限制,TaskTracker会杀掉该任务,并将任务状态KILLED汇报给YARN,从而重新调度该任务。

在实际应用场景中,有些正常的作业,其任务可能长时间没有读入或者输出,比如读取数据库的MapTask或者需要连接其他外部系统的Task,对于这类应用,在编写Mapper或Reducer时,应当启动一个额外的线程通过Reporter组件定期向TaskTracker汇报心跳(只是告诉TaskTracker自己还活着,不要把我杀了)。

三 在MapTask任务运行完毕,ReduceTask运行过程中,某个MapTask节点挂了,或者某个MapTask结果存放的那磁盘坏掉了

Case1:如果节点挂掉,JobTracker通过心跳机制知道TaskTracker死掉了,会重新调度之前正在运行的Task和正在运行的作业中已经运行完成的MapTask

Case2:如果节点没有挂,只是存放MapTask结果的磁盘损坏了,则分两种情况

#所有的ReduceTask已经完成shuffle阶段

#尚有部分ReduceTask没有完成shuffle阶段,需要读取该MapTask任务

对于第一种情况,如果所有ReduceTask一路顺风地运行下去,则无需对已经运行完成的MapTask作任何处理,如果某些ReduceTask一段时间后运行失败了,则处理方式与第二种一样。

对于第二种情况,当ReduceTask远程读取那个已经运行完成的MapTask结果(但结果已经损坏)时,会尝试读取若干次,如果尝试次数超过了某个上限值,则会通过RPC告诉所在的TaskTracker该MapTask结果已经损坏,而TaskTracker则进一步通过RPC告诉JobTracker,JobTracker收到该消息后,会重新调度该MapTask,进而重新计算生成结果。

问题一:在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没有起到作用

如果是物理内存溢出,需要调整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)。

每次处理100G左右的数据,但是程序一运行,CPU使用率会达到100%,直到任务结束,内存使用不会达到最大。在NodeMangager机器上,使用jps命令查看,会发现有8个YarnChild进程,是否可以通过更改配置文件来减少YarnChild进程数量,来达到减少CPU占用。

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

Error:org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shufflein fetcher#1
        at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134)
        atorg.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:376)
        atorg.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
        atjava.security.AccessController.doPrivileged(Native Method)
        atjavax.security.auth.Subject.doAs(Subject.java:396)
        atorg.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556)
        atorg.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
Caused by: java.lang.OutOfMemoryError: Java heap space
        atorg.apache.hadoop.io.BoundedByteArrayOutputStream.<init>(BoundedByteArrayOutputStream.java:56)
        atorg.apache.hadoop.io.BoundedByteArrayOutputStream.<init>(BoundedByteArrayOutputStream.java:46)
        atorg.apache.hadoop.mapreduce.task.reduce.InMemoryMapOutput.<init>(InMemoryMapOutput.java:63)
        atorg.apache.hadoop.mapreduce.task.reduce.MergeManagerImpl.unconditionalReserve(MergeManagerImpl.java:297)
        at org.apache.hadoop.mapreduce.task.reduce.MergeManagerImpl.reserve(MergeManagerImpl.java:287)
        atorg.apache.hadoop.mapreduce.task.reduce.Fetcher.copyMapOutput(Fetcher.java:411)
        atorg.apache.hadoop.mapreduce.task.reduce.Fetcher.copyFromHost(Fetcher.java:341)
        at org.apache.hadoop.mapreduce.task.reduce.Fetcher.run(Fetcher.java:165)

参数mapreduce.reduce.shuffle.input.buffer.percent控制运行reduce任务的机子上多少比例的内存用作上述buffer(默认值为0.70),参数mapreduce.reduce.shuffle.parallelcopies控制shuffle过程的并行度(默认值为5)
那么"mapreduce.reduce.shuffle.input.buffer.percent"* "mapreduce.reduce.shuffle.parallelcopies" 必须小于等于1,否则就会出现如上错误
因此,我将mapreduce.reduce.shuffle.input.buffer.percent设置成值为0.1,就可以正常运行了(设置成0.2,还是会抛同样的错)

另外,可以发现如果使用两个参数的默认值,那么两者乘积为3.5,大大大于1了,为什么没有经常抛出以上的错误呢?
1)首先,把默认值设为比较大,主要是基于性能考虑,将它们设为比较大,可以大大加快从map复制数据的速度

2)其次,要抛出如上异常,还需满足另外一个条件,就是map任务的数据一下子准备好了等待shuffle去复制,在这种情况下,就会导致shuffle过程的“线程数量”和“内存buffer使用量”都是满负荷的值,自然就造成了内存不足的错误;而如果map任务的数据是断断续续完成的,那么没有一个时刻shuffle过程的“线程数量”和“内存buffer使用量”是满负荷值的,自然也就不会抛出如上错误

另外,如果在设置以上参数后,还是出现错误,那么有可能是运行Reduce任务的进程的内存总量不足,可以通过mapred.child.Java.opts参数来调节,比如设置mapred.child.java.opts=-Xmx2024m

我也遇到了任务一直在pending状态,不能往下运行,经过几天的倒腾的,总算解决了现在把我的解决方法跟大家分享下,这几天在网上也查了很多资料,没有比较靠谱的回答因为我设置了yarn.nodemanager.resource.memory-mb 这个的大小为1024MB,
即每个节点上的内存大小为1024,但是我运行的wordcount需要的内存比我设置的要大,导致我的任务状态一直在pending状态中

如果你配置了yarn.nodemanager.resource.memory-mb这个配置项,你把值改大些,或者直接就用默认的然后再根据需要去调整

问题:发现每次reduce阶段跑到98%,相关的Container被杀,报出的log大概的意思:container600s未报告进度超时被杀

在mapreduce程序里加上conf.set("mapred.task.timeout","0");

//不检查超时

重新打包运行,最后没有出现错误,但是运行很长时间,总算运行完了,怀疑程序问题有大循环
最后检查reduce发现会有双层循环,有可能会非常大,导致卡在reduce内部,长时间没有进行任何的读写,也就没有汇报他的进度情况

总结

问题的原因起于对于悬挂的task,如果NMr在一段时间(默认是10min,可以通过mapred.task.timeout属性值来设置,单位是毫秒)内一直没有收到它的进度报告,则把它标记为失效

MapReduce之如何处理失败的task相关推荐

  1. hive mapreduce任务启动mapjoin失败,return code 3

    hive mapreduce任务启动mapjoin失败,return code 3 设置hive的自动加载小表大小 出现问题 调整map任务内存 远程dubug 源码 问题解决 PS:解决方法只针对问 ...

  2. MapReduce程序调整Map/Reduce task内存参数

    参考:https://blog.csdn.net/u014665013/article/details/80923044 1.先看yarn.scheduler.minimum-allocation-m ...

  3. Hadoop较全面的概述

    看到的比较全面的介绍 Hadoop 1.0 和 2.0的区别 软件栈如下图: Hadoop 1.0的内核主要由两部分构成: HDFS  存储大数据的平台,提供可靠性的存储服务(冗余数据,存储). Ma ...

  4. YARN - Task, Node manager, AppMaster, Resource manager 失败时所做的处理

    本文为< Hadoop 权威指南第四版 >(英文原版) 读书笔记,仅限交流使用,转载请注明出处,多谢. YARN - 失败时所做的处理 Henvealf/文 YARN 的失败总共包含四种实 ...

  5. MapReduce:Simplified Data Processing on Large Clusters中文版from百度文库

    超大集群的简单数据处理 转自百度文库 Jeffrey Dean Sanjay Ghemawat jeff@google.com , sanjay@google.com Google , Inc. 摘要 ...

  6. 《MapReduce: Simplified Data Processing on Large Clusters》译文

    原文链接:http://stanford.edu/class/cs345d-01/rl/mapreduce.pdf MapReduce:在大规模集群上简化数据处理 作者:Jeffrey Dean和Sa ...

  7. hadoop生态圈面试精华之MapReduce(二)

    hadoop生态圈面试精华之MapReduce(二) shuGle为什么要排序? 问过的一些公司:携程(2021.09),网易有道(2021.09) 参考答案: shuffle排序,按字典顺序排序的, ...

  8. hadoop之MapReduce框架TaskTracker端心跳机制分析(源码分析第六篇)

    1.概述 MapReduce框架中的master/slave心跳机制是整个集群运作的基础,是沟通TaskTracker和JobTracker的桥梁.TaskTracker周期性地调用心跳RPC函数,汇 ...

  9. 文件数据云计算学习笔记---Hadoop HDFS和MapReduce 架构浅析

    本文是一篇关于文件数据的帖子 媒介 Hadoop是一个基于Java的分布式麋集数据处理和数据分析的软件框架.Hadoop在很大程度上是受Google在2004年白皮书中论述的MapReduce技术的启 ...

最新文章

  1. 【简报】超棒的拖放式文件上传javascript类库:FileDrop
  2. ireport怎么套打_阴阳师:当前版本道馆突破怎么打?九套阵容让你成为道馆小能手...
  3. [导入]Vista的translator.gadget(117.64 KB)
  4. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
  5. 解决springBoot 的templates中html引入css文件失败
  6. Linux 命令整理 —— 基本操作
  7. 通过java程序实现mysql 批量一个表的子段更新另一个表的字段
  8. before和after怎么区分_深入理解::before/:before和::after/:after的使用
  9. python将图片转化成字符图片_python如何将图片转换为字符图片
  10. linux系统下JDK的下载安装和配置教程
  11. Java、python实现啊哈算法 —— chapter3 枚举 炸弹人
  12. 一位AI CEO的生死四十天
  13. 技术负责人如何搞定老板之我所见
  14. 520催泪感人表白心动文案怎么用免费的记笔记软件记录?
  15. 邮储银行软件开发中心(实习) 面经
  16. 大学物理 质点运动学
  17. Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法)
  18. 用网络进行内核调试 VMware+windbg
  19. IE 8兼容:X-UA-Compatible的解释
  20. 学习华为特殊端口模式Hybrid(带配置命令)

热门文章

  1. mysql 授权指定库,mysql创建新用户并给授权指定的数据库权限
  2. linux系统检测脚本,脚本检测linux系统资源
  3. php能干哪些副业,做副业,在能干的基础上踏实肯干
  4. java 定义多个变量_学了Java才搞懂JMeter测试计划
  5. 遗传算法入门到掌握(二)
  6. 启动修复黑屏服务器,使用光标修复Windows 10黑屏
  7. 单片机中段程序_单片机c语言中的一小段程序解读
  8. Shamir密钥分享算法 python实现
  9. windows无法移动修复此计算机,无法安装Windows 10移动创作者更新[修复] | MOS86
  10. java 字典 引用_java中数据字典的使用