输出文件大小为零

时间:2012-05-03 05:48:51

标签: hadoop mapreduce

我正在运行Hadoop mapreduce流媒体作业(mappers only job)。在某些情况下,我的作业写入stdout,然后创建一个非零大小的输出文件。在某些情况下,我的作业不会向stdout写入任何内容,但仍会创建大小为零的输出文件。当没有任何内容写入stdout时,有没有办法避免创建大小为零的文件。

2 个答案:

答案 0 :(得分:0)

如果您不介意扩展当前的输出格式,只需要在没有写入数据时覆盖OutputCommitter以“中止”commitTask阶段。

请注意,并非所有输出格式都显示空文件的零文件字节(例如序列文件有标题),因此您不能只检查输出文件大小。

查看以下文件的来源:

  • OutputCommitter - 基本抽象类
  • FileOutputCommitter - 大多数FileOutputFormats使用此提交者,因此它是一个很好的起点。查看私有方法moveTaskOutputs,这是您的逻辑很可能去的地方(如果没有写任何内容,则不复制文件)

答案 1 :(得分:0)

您使用的是MultipleOutputs吗? 如果是,则MultipleOutputs会创建默认文件,即使reducer没有任何内容可写入输出。 要避免此默认的零大小输出,您可以使用LazyOutputFormat.setOutputFormatClass()

根据我的经验,即使您使用的是LazyOutputFormat,也会在以下情况下创建零大小的文件:Reducer有一些要写入的数据(因此创建了输出文件),但reducer在写入输出之前被终止。我认为这是一个计时问题,因此您可能会发现HDFS中只存在部分reducer输出文件,或者您可能根本没有观察到这一点。

例如。如果你有10个减速器,你可能只有&#39; n&#39; (n <= 10)个文件数,其中一些文件大小等于0个字节。