hadoop - hadoop map reduce 中的错误处理

标签 hadoop error-handling mapreduce distributed-system

根据文档,有几种方法可以在 map reduce 中执行错误处理。以下是一些:

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

记录错误并稍后分析。

计数器给出失败记录的数量。但是要获取失败记录的标识符(可能是它的唯一键),以及发生异常的详细信息,发生错误的节点——我们需要进行集中的日志分析,并且有很多节点在运行。 Logstash 在其上可用。

除此之外,是否还有其他方法可以在无需人工干预的情况下处理错误场景。欢迎任何工具、引用、最佳实践。

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

最佳答案

在处理错误时要问的几个问题:

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

    有时最好通过跳过坏记录或让作业运行 同时,使用以下技术解决问题(错误),并在进行过程中进行纠正和修改。

  2. 您希望错误发生,但仅限于有限的次数。那么在整个作业停止之前可以抛出多少次异常如下

    对于 Map 任务:ma​​preduce.map.maxattempts 属性

    对于 reducer 任务:ma​​preduce.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>
    

关于hadoop - hadoop map reduce 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255196/

相关文章:

apache-spark - Parquet 如何确定使用哪种编码?

hadoop编译

jquery - MVC 与 JQuery : handling Session Expire

linux - Linux 和 Hadoop 文件系统的区别

hadoop - 如何在不使用 Wireshark 的情况下使用 Flume 在 Hadoop 中捕获网络流量?

symfony - Symfony 2错误处理异常与Flashbag

bash - bash脚本,将stderr定向到文件,将stdout + stderr定向到终端,并返回退出代码

google-app-engine - 如何调试具有数百万次写入的长时间运行的 MapReduce 作业?

java - 查找数据集中的 Top-K 记录

hadoop - hadoop中的总订单分区器