我正在运行Hadoop mapreduce流媒体作业(mappers only job)。在某些情况下,我的作业写入stdout,然后创建一个非零大小的输出文件。在某些情况下,我的作业不会向stdout写入任何内容,但仍会创建大小为零的输出文件。当没有任何内容写入stdout时,有没有办法避免创建大小为零的文件。
答案 0 :(得分:0)
如果您不介意扩展当前的输出格式,只需要在没有写入数据时覆盖OutputCommitter以“中止”commitTask阶段。
请注意,并非所有输出格式都显示空文件的零文件字节(例如序列文件有标题),因此您不能只检查输出文件大小。
查看以下文件的来源:
moveTaskOutputs
,这是您的逻辑很可能去的地方(如果没有写任何内容,则不复制文件)答案 1 :(得分:0)
您使用的是MultipleOutputs吗? 如果是,则MultipleOutputs会创建默认文件,即使reducer没有任何内容可写入输出。 要避免此默认的零大小输出,您可以使用LazyOutputFormat.setOutputFormatClass()
根据我的经验,即使您使用的是LazyOutputFormat,也会在以下情况下创建零大小的文件:Reducer有一些要写入的数据(因此创建了输出文件),但reducer在写入输出之前被终止。我认为这是一个计时问题,因此您可能会发现HDFS中只存在部分reducer输出文件,或者您可能根本没有观察到这一点。
例如。如果你有10个减速器,你可能只有&#39; n&#39; (n <= 10)个文件数,其中一些文件大小等于0个字节。