1


我在 HDFS 上有很多包含大量文本文件的 tar.gz 文件的日常文件夹。
发现其中许多 tar.gz 已损坏,并导致 hive/mapreduce 作业在处理这些文件时因“意外的流结束”而崩溃。

我确定了其中的一些并使用 tar -zxvf 对其进行了测试。他们确实因错误而退出,但在此发生之前仍会提取相当数量的文件。

当 tar/gz 文件损坏时,有没有办法阻止 hive/mapreduce 作业简单地崩溃?我测试了一些错误跳过和容错参数,例如
mapred.skip.attempts.to.start.skipping、
mapred.skip.map.max.skip.records、
mapred.skip.mode.enabled、
mapred.map.max .attempts,
mapred.max.map.failures.percent,
mapreduce.map.failures.maxpercent。

它有助于在少数情况下处理完整的文件夹而不会崩溃,但大多数情况下这会导致作业挂起并且根本无法完成。

解压缩hadoop外部的每个文件只是为了在之后重新压缩它们(以获得干净的gzip文件)然后再次上传到hdfs将是一个非常痛苦的过程(因为额外的步骤和大量的数据会产生)

有人找到了更清洁/更优雅的解决方案吗?

谢谢你的帮助。

4

2 回答 2

1

我在这里参加聚会已经很晚了,但是我刚刚遇到了 gzip 文件损坏的确切问题。我最终通过编写自己的方法来解决它,RecordReader它会捕获IOExceptions,记录有问题的文件的名称,然后优雅地丢弃该文件并继续下一个文件。

我已经写了一些细节(包括这里的自定义代码:http Record Reader: //daynebatten.com/2016/03/dealing-with-corrupt-or-blank-files-in-hadoop/

于 2016-03-22T13:05:35.180 回答
0

我基本上看到了两种出路:

  1. 您为 Hadoop 创建了一个补丁,允许对损坏的文件进行这种处理,然后简单地针对损坏的文件运行应用程序。
  2. 您创建了一个特殊的 hadoop 应用程序,该应用程序使用您自己的自定义“gunzip”实现(可以处理这些类型的问题)。然后,此应用程序仅作为映射器作业(身份映射器)读取和写入文件。然后将此作业的输出用作您的正常 mapreduce/pig/hive/... 作业的输入。
于 2013-10-22T19:13:53.357 回答