根据文档,有几种方法可以说明在mapreduce中如何执行错误处理。以下是一些:
。对每个失败记录使用enum - increment自定义计数器。
b。记录错误,以后再分析。
计数器给出失败记录的数量。然而,要获得失败记录的标识符(可能是它的唯一键),以及发生异常的详细信息,发生错误的节点-我们需要执行集中的日志分析,并且有许多节点正在运行。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>