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