整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

6.5.5. 跳过坏记录

hadoop 小红牛 7℃ 0评论

大型数据集十分庞杂。它们经常有损坏的记录。它们经常有不同格式的记录。它们经常有缺失的字段。在理想情况下,用户代码可以很好地处理这些情况。但实际情况中,忽略这些坏的记录只是权宜之计。取决于正在执行的分析,如果只有一小部分记录受影响,那么忽略它们并不会显著影响结果。然而,如果一个任务由于遇到一个坏的记录而发生问题一一通过抛出一个运行时异常一一任务就会失败。失败的任务将被重新运行(因为失败可能是由硬件故障或任务可控范围之外的一些原因造成的),但如果一个任务失败4次,那么整个作业会被标记为失败。如果数据是导致任务抛出异常的“元凶”,那么重新运行任务将无济于事,因为它每次都会因相同的原因而失败。

 

如果正在使用TextlnputFormat,则可以设置一个预期的行最大长度来防止损坏文件。文件中损坏的记录显示为一个非常长的行,这将引起内存溢出错误并导致任务失败。通过将mapred.linerecordreader.maxlength设置为一个适合内存的以字节衡量的值(一般长于输入数据中行的长度),记录reader将跳过(长的)损坏的行,而不是直接导致任务失败。

最好在mapperreducer代码中处理被损坏的记录。我们可以检测出坏记录并忽略它,或通过抛出个异常来中止作业运行。还可以使用计数器来计算作业中总的坏记录数,看问题影响的范围有多广。

有极少数情况是不能处理的。例如,软件缺陷存在于第三方的库中,我们是无法在mapperreducer中修改它的。在这些情况下,可以使用Hadoop skipping mode选项自动跳过坏记录。

启用skipping mode后,任务将正在处理的记录报告给tasktracker。任务失败时,tasktracker重新运行该任务,跳过导致任务失败的记录。由于额外的网络流量和记录错误以维护失败记录范围,所以只有在任务失败两次之后才会启用 skipping mode

因此,针对一个总是在某条坏记录上失败的任务,tasktracker将根据以下运行结果来启动任务尝试。

(1)任务失败。

(2)任务失败。

(3)开启skipping mode。任务失败,但是失败记录由tasktracker 保存。

(4)仍然启用skipping mode。任务继续运行,但跳过上一次尝试中失败的坏记录。

 

在默认情况下,skipping mode是关闭的,我们用SkipBadRedcord类单独为mapreduce任务启用此功能。值得注意的是,每次任务尝试, skipping mode都只能检测出一个坏记录,因此这种机制仅适用于检测个别坏记录(也就是说,每个任务只有少数几个坏记录)。为了给skipping mode 足够多尝试次数来检测并跳过一个输入分片中的所有坏记录,需要增加最多任务尝试次数(通过 mapned.map.max. attemps mapred. reduce. max.attemps 进行设置)

Hadoop检测出来的坏记录以序列文件的形式保存在_logs/skip子目录下的作业输出目录中。在作业完成后,我们可以查看这些记录(例如,使用hadoop fs-text)进行诊断。

 

转载请注明:全栈大数据 » 第六章 MapReduce的工作机制

转载请注明:全栈大数据 » 6.5.5. 跳过坏记录

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址