根据文档,有几种方法,如何在map reduce中执行错误处理。以下是少数几个:
一个。使用枚举的自定义计数器 - 每个失败记录的增量。
湾记录错误并稍后分析。
计数器给出失败记录的数量。但是,要获取失败记录的标识符(可能是其唯一密钥),并且发生异常的详细信息,发生错误的节点 - 我们需要执行集中式日志分析,并且有许多节点正在运行。可以使用Logstash。
除此之外,还有其他方法可以处理错误情况,无需人工干预。欢迎使用任何工具,参考资料和最佳实践。
我认为相同的技术适用于任何分布式应用程序,只需稍作修改。
答案 0 :(得分:3)
在处理错误处理时,几乎没有问题要问:
如果数据验证中发生错误,应该停止作业。大多数大数据用例可能会留下一些不良记录。但是,如果您的用例希望所有记录都足够好,您应该采取该决定并转到以下步骤。
有时候,通过跳过不良记录或者更好地让工作顺利进行 并行地,使用以下技术获取问题(错误),在您移动时进行纠正和修改。
您希望错误发生,但只有有限的时间。然后在整个作业停止之前抛出异常的次数如下所示
对于地图任务: mapreduce.map.maxattempts 属性
对于减速器任务: 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>