i am very much new to hadoop,can any one give me a simple program on how to skip bad recors in hadoop map/reduce?
Thanks in Advance
由于您正在根据字段的缺失过滤记录,因此这是适合您的 Mapper 实现的逻辑。Java API Mapper 可能看起来像这样:
public class FilteringMapper extends Mapper<LongWritable, Text, LongWritable, Text>{
private static final Logger _logger = Logger.getLogger(FilteringMapper.class);
protected void map(LongWritable key, Text value, Context context) {
if(recordIsBad(value))
_logger.info(<log record data you care about>);
else
context.write(key, value);
}
private boolean recordIsBad(Text record){
//return true if record is bad by your standards
}
}
此 Mapper 只会根据您的标准进行过滤。如果您需要在 Mapper 中进一步转换数据,这很容易添加。
处理损坏记录的最佳方法是在您的映射器或减速器代码中。您可以检测到不良记录并忽略它,或者您可以通过抛出异常中止作业。您还可以使用计数器计算作业中不良记录的总数,以查看问题的普遍程度。但是,在极少数情况下,您无法处理该问题,因为第三方库中存在您无法在映射器或减速器中解决的错误。在这些情况下,您可以使用 Hadoop 的可选跳过模式来自动跳过不良记录。启用跳过模式后,任务会将正在处理的记录报告回 tasktracker。当任务失败时,tasktracker 会重试该任务,跳过导致失败的记录。由于额外的网络流量和簿记来维护失败的记录范围,
因此,对于始终因不良记录而失败的任务,tasktracker 会运行以下任务尝试并获得这些结果:
任务失败。
任务失败。
启用跳过模式。任务失败,但失败记录由 tasktracker 存储。
跳过模式仍处于启用状态。任务通过跳过在前一次尝试中失败的坏记录来成功。
跳过模式默认关闭;
SkipBadRecords
您可以使用该类为 map 和 reduce 任务独立启用它。需要注意的是,跳过模式每次任务尝试只能检测到一个坏记录,因此这种机制仅适用于检测偶尔的坏记录(例如,每个任务几个)。您可能需要增加最大任务尝试次数(通过mapred.map.max.attempts
和mapred.reduce.max.attempts
),以使跳过模式有足够的尝试来检测和跳过输入拆分中的所有不良记录。Hadoop 检测到的不良记录作为序列文件保存在_logs/skip
子目录下的作业输出目录中。在作业完成后,可以出于诊断目的检查这些(hadoop fs -text
例如,使用 )。
来自Tom White的“ Hadoop:权威指南”的文本
mapreduce.map.skip.maxrecords
您可以通过设置属性和/或mapreduce.reduce.skip.maxgroups
将值设置为 >0(默认为 0)来跳过 MapReduce 作业中的记录。
这是一个简单的命令,您可以使用Hadoop 流在 shell 上运行它来启动将忽略 1000 个映射器失败的 MapReduce 作业:
mapred streaming \
-D mapreduce.map.skip.maxrecords=1000 \
-file map.sh \
-file reduce.sh \
-input myInputDir \
-output myOutputDir \
-mapper map.sh \
-reducer reduce.sh
(其中map.sh
和reduce.sh
是可执行的 bash 脚本)。
从文档中:
Hadoop 提供了一个选项,在处理地图输入时可以跳过特定的错误输入记录集。应用程序可以通过SkipBadRecords类控制此功能。
当地图任务在某些输入上确定性地崩溃时,可以使用此功能。这通常是由于地图功能中的错误而发生的。通常,用户必须修复这些错误。然而,这有时是不可能的。该错误可能存在于第三方库中,例如,其源代码不可用。在这种情况下,即使经过多次尝试,任务也永远不会成功完成,并且作业会失败。使用此功能,只有一小部分不良记录周围的数据会丢失,这对于某些应用程序(例如,对非常大的数据执行统计分析的应用程序)来说可能是可以接受的。
您可以在 中查看与跳过记录相关的所有属性mapred-default.xml
。
另一个相关属性是mapreduce.task.skip.start.attempts
:MR 任务开始跳过记录之前的失败尝试次数(默认为 2)。