6.5.3 跳过坏记录
MapReduce作业处理的数据集非常庞大,用户在基于MapReduce编写处理程序时可能并不会考虑到数据集中的每一种数据格式和字段(特别是某些坏的记录)。所以,用户代码在处理数据集中的某个特定记录时可能会崩溃。这个时候即使MapReduce有错误处理机制,但是由于存在这种代码缺陷,即使重新执行4次(默认的最大重新执行次数),这个任务仍然会失败,最终也会导致整个作业失败。所以针对这种由于坏数据导致任务抛出的异常,重新运行任务是无济于事的。但是,如果想要在庞大的数据集中找出这个坏记录,然后在程序中添加相应的处理代码或直接除去这条坏记录,显然也是很困难的一件事情,况且并不能保证没有其他坏记录。所以最好的办法就是在当前代码对应的任务执行期间,遇到坏记录时就直接跳过去(由于数据集巨大,忽略这种极少数的坏记录是可以接受的),然后继续执行,这就是Hadoop中的忽略模式(skipping模式)。当忽略模式启动时,如果任务连续失败两次,它会将自己正在处理的记录告诉TaskTracker,然后TaskTracker会重新运行该任务并在运行到先前任务报告的记录时直接跳过。从忽略模式的工作方式可以看出,忽略模式只能检测并忽略一个错误记录,因此这种机制仅适用于检测个别错误记录。如果增加任务尝试次数最大值(这由mapred.map.max.attemps和mapred.reduce.max.attemps两个属性决定),可以增加忽略模式能够检测并忽略的错误记录数目。默认情况下忽略模式是关闭的,可以使用SkipBadRedcord类单独为Map和Reduce任务启用它。