根据文档,有几种方法可以在 MapReduce 中执行错误处理。以下是一些:
A。使用枚举的自定义计数器 - 每个失败记录的增量。
b.记录错误并稍后分析。
计数器给出失败记录的数量。然而,为了获取失败记录的标识符(可能是其唯一键),以及发生异常的详细信息,发生错误的节点 - 我们需要执行集中式日志分析,并且有很多节点正在运行。 Logstash 是可用的。
除此之外,是否还有其他方法可以处理错误场景,而无需人工干预。欢迎任何工具、参考、最佳实践。
我认为同样的技术适用于任何分布式应用程序,只需进行一些细微的更改。
在处理错误时,有几个问题需要问:
-
如果数据验证中发生错误,是否应该停止作业。大多数大数据用例可能不会留下一些不良记录。但是,如果您的用例希望所有记录都足够好,您应该做出决定并继续执行以下步骤。
有时,最好通过跳过不良记录来让作业运行,或者
同时,使用以下技术找出问题(错误),并在前进过程中进行纠正和修改。
-
您希望错误发生,但只发生有限的次数。那么在整个作业停止之前可以抛出异常多少次,如下所示
对于地图任务:mapreduce.map.maxattempts财产
对于减速器任务:mapreduce.reduce.maxattempts
默认值为 4
-
处理格式错误的数据。
因此我们决定处理格式错误的数据。然后定义条件或
记录很糟糕。您可以使用计数器,快速为您提供
不良记录数量。
在映射器类中,
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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)