如何跳过hadoop map-reduce中的错误记录

时间:2013-09-11 11:58:15

标签: hadoop mapreduce bigdata

我非常喜欢hadoop,任何人都可以给我一个关于如何在hadoop map / reduce中跳过不良记录的简单程序吗?

先谢谢

4 个答案:

答案 0 :(得分:2)

由于您是根据字段缺失过滤记录,因此这是适合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中进一步转换数据,则可以轻松添加。

答案 1 :(得分:1)

答案 2 :(得分:1)

  

处理损坏记录的最佳方法是在mapper或reducer中   码。您可以检测到错误记录并忽略它,或者您可以中止   通过抛出异常来完成工作。您还可以计算总数   在使用计数器的工作中的不良记录,看看有多广泛   问题是。但在极少数情况下,您无法解决问题   因为第三方库中存在一个您无法工作的错误   在你的mapper或reducer中。在这些情况下,您可以使用Hadoop   可选跳过模式,用于自动跳过不良记录。什么时候   启用跳过模式,任务报告正在处理的记录   回到tasktracker。任务失败时,tasktracker将重试   任务,跳过导致失败的记录。因为   额外的网络流量和簿记,以维持失败的记录   范围,仅在任务失败后为任务打开跳过模式   两次。

     

因此,对于一个始终在错误记录上失败的任务,tasktracker   使用以下结果运行以下任务尝试:

     
      
  1. 任务失败。

  2.   
  3. 任务失败。

  4.   
  5. 启用了跳过模式。任务失败,但是失败的记录由tasktracker存储。

  6.   
  7. 仍然启用了跳过模式。任务通过跳过上次尝试失败的错误记录而成功。

  8.         

    默认情况下,跳过模式已关闭;你为地图独立启用它   并使用SkipBadRecords类减少任务。这很重要   请注意,跳过模式每个任务只能检测到一个错误记录   尝试,所以这种机制仅适用于检测   偶尔会出现不良记录(比如每个任务)。你可能需要增加   最大任务尝试次数(通过mapred.map.max.attempts和   mapred.reduce.max.attempts)给予跳过模式足够的尝试   检测并跳过输入拆分中的所有错误记录。不好的记录   已被Hadoop检测到的序列文件保存在   _logs/skip子目录下的作业输出目录。这些可以   在工作完成后进行检查以进行诊断   (例如,使用hadoop fs -text

来自&#34; Hadoop的文字:权威指南&#34;汤姆怀特

答案 3 :(得分:0)

您可以通过将属性mapreduce.map.skip.maxrecords和/或mapreduce.reduce.skip.maxgroups设置为值> 0(默认为0)来跳过MapReduce作业中的记录。

这是一个简单的命令,您可以使用Hadoop streaming在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.shreduce.sh是可执行的bash脚本)。

来自documentation

  

Hadoop提供了一个选项,其中某些不良输入记录集可以   在处理地图输入时被跳过。应用程序可以控制此   通过SkipBadRecords类。

     

当地图任务确定性崩溃时,可以使用此功能   某些输入。这通常是由于map函数中的错误引起的。   通常,用户必须修复这些错误。但是,这不是   有时可能。该错误可能在第三方库中,   例如,其源代码不可用。在这种情况下   即使多次尝试,任务也永远不会成功完成,   而工作失败。使用此功能,仅一小部分数据   不良记录的丢失,这对于某些人来说可以接受   应用程序(那些执行非常大的统计分析   数据)。

您可以在mapred-default.xml中看到与跳过记录有关的所有属性。

另一个相关属性是mapreduce.task.skip.start.attempts:MR任务开始跳过记录之前的失败尝试次数(默认为2)。