hadoop map中的错误处理减少

时间:2015-08-27 16:48:30

标签: hadoop error-handling mapreduce distributed-system

根据文档,有几种方法,如何在map reduce中执行错误处理。以下是少数几个:

一个。使用枚举的自定义计数器 - 每个失败记录的增量。

湾记录错误并稍后分析。

计数器给出失败记录的数量。但是,要获取失败记录的标识符(可能是其唯一密钥),并且发生异常的详细信息,发生错误的节点 - 我们需要执行集中式日志分析,并且有许多节点正在运行。可以使用Logstash。

除此之外,还有其他方法可以处理错误情况,无需人工干预。欢迎使用任何工具,参考资料和最佳实践。

我认为相同的技术适用于任何分布式应用程序,只需稍作修改。

1 个答案:

答案 0 :(得分:3)

在处理错误处理时,几乎没有问题要问:

  1. 如果数据验证中发生错误,应该停止作业。大多数大数据用例可能会留下一些不良记录。但是,如果您的用例希望所有记录都足够好,您应该采取该决定并转到以下步骤。

    有时候,通过跳过不良记录或者更好地让工作顺利进行 并行地,使用以下技术获取问题(错误),在您移动时进行纠正和修改。

  2. 您希望错误发生,但只有有限的时间。然后在整个作业停止之前抛出异常的次数如下所示

    对于地图任务: mapreduce.map.maxattempts 属性

    对于减速器任务: mapreduce.reduce.maxattempts

    默认为4

  3. 处理格式错误的数据。

    所以我们决定处理格式错误的数据。然后定义条件或 哪个记录不好。你可以使用计数器,快速给你 坏记录的数量。

    在Mapper类中,

    enum Temperature { OVER_10 }
    

    内部地图方法,

    //解析记录

    if(value > 10) {
        System.err.println("Temperature over 100 degrees for input: " + value);
        context.setStatus("Detected possibly corrupt record: see logs.");
        context.getCounter(Temperature.OVER_10).increment(1);      
    }
    

    使用上述方法,将处理所有记录,并根据错误记录添加计数器。您可以在作业结束时,作业统计之后或通过Web UI或shell命令查看计数器值。

    $mapred job -counter <job_id> '${fully_qualified_class_name}' ${enum_name}
    $mapred job -counter job_1444655904448_17959 'com.YourMapper$Temperature' OVER_10
    

    一旦你知道问题的影响,即不良记录的数量,我们需要知道“为什么它不好”。为此,我们需要转到日志 并搜索错误消息。

    Yarn提供日志聚合,并将作业ID和存储的所有日志组合在hdfs中。它可以使用

    yarn logs -applicationId <application ID>