0

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

4

2 回答 2

0

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

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

查看以下文件的来源:

  • OutputCommitter - 基础抽象类
  • FileOutputCommitter - 大多数 FileOutputFormats 都使用这个提交器,所以它是一个很好的起点。查看私有方法moveTaskOutputs,这是您的逻辑最有可能出现的地方(如果没有写入,则不复制文件)
于 2012-05-10T03:08:28.210 回答
0

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

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

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

于 2016-07-19T00:18:03.597 回答