2012-05-03 92 views
0

我正在运行Hadoop mapreduce流式作业(仅适用于mappers工作)。在某些情况下,我的作业写入标准输出,从而创建一个非零大小的输出文件。在某些情况下,我的作业不会向stdout写入任何内容,但仍会创建大小为零的输出文件。有没有办法避免在没有任何内容写入标准输出时创建这个大小为零的文件。输出文件大小为零

+0

我不这么认为。 –

回答

0

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

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

看看源下列文件:

  • OutputCommitter - 基抽象类
  • FileOutputCommitter - 大多数FileOutputFormats使用的提交者所以这是一个良好的开端。看看私有方法moveTaskOutputs,这是你的逻辑将最有可能去(不要复制的文件,如果没有写入)
0

是否使用MultipleOutputs? 如果是,则即使Reducer没有任何内容写入输出,MultipleOutputs也会创建默认文件。 为了避免这种默认零大小的输出,你可以使用LazyOutputFormat.setOutputFormatClass()

从我的经验,即使您正在使用LazyOutputFormat,创建零大小的文件时:减速机有一定的数据写入(因此创建输出文件)但在编写输出之前还原器会死亡。我相信这是一个计时问题,所以你可能会发现HDFS中只存在部分缩减器输出文件,或者你可能根本没有注意到这一点。

例如。如果您有10个reducer,则可能只有'n'(n < = 10)个文件,其中一些文件大小等于0个字节。