根据文档,有几种方法可以在 map reduce 中执行错误处理。以下是一些:
一个。使用枚举的自定义计数器 - 每条失败的记录都会递增。
记录错误并稍后分析。
计数器给出失败记录的数量。但是要获取失败记录的标识符(可能是它的唯一键),以及发生异常的详细信息,发生错误的节点——我们需要进行集中的日志分析,并且有很多节点在运行。 Logstash 在其上可用。
除此之外,是否还有其他方法可以在无需人工干预的情况下处理错误场景。欢迎任何工具、引用、最佳实践。
我认为相同的技术适用于任何分布式应用程序,只需稍作改动即可。
最佳答案
在处理错误时要问的几个问题:
如果数据验证发生错误,作业是否应该停止。大多数大数据用例都可以留下很少的不良记录。但是,如果您的用例希望所有记录都足够好,您应该做出该决定并转到以下步骤。
有时最好通过跳过坏记录或让作业运行 同时,使用以下技术解决问题(错误),并在进行过程中进行纠正和修改。
您希望错误发生,但仅限于有限的次数。那么在整个作业停止之前可以抛出多少次异常如下
对于 Map 任务:mapreduce.map.maxattempts 属性
对于 reducer 任务:mapreduce.reduce.maxattempts
默认为 4
处理格式错误的数据。
因此我们决定处理格式错误的数据。然后定义条件或 记录不好。你可以使用计数器,快速给你 不良记录数。
在 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/