2014-10-01 57 views
1

在Hadoop中是否有一种明智的方式来编写大量的输出文件?我一直在使用MultipleOutputs。但是,MultipleOutputs为每个文件分配一个大的(〜1MB)缓冲区,所以我遇到了内存问题。大量的Hadoop输出文件

我的数据排序是这样的,在任何给定的reducer中,我都可以写入目标文件,关闭它,然后继续下一个。不幸的是,MultipleOutputs不公开一种关闭给定文件的方法。我写了一个修改后的MultipleOutputs,它公开了这样一种方法,并处理了这个问题,但这看起来并不理想。

另一种方法是将我的输出分割成所需文件的最后一步,但我不确定是否有这样做的好方法。

+0

请定义“大数”。你希望的功能是什么?输出文件的数量等于减速器的数量,因此快速解决方法是将所需的减速器数量设置为所需的输出文件数量。 – vefthym 2014-10-02 10:08:13

+0

我不愿意那样做;输出的尺寸大不相同。本质上,我想将输出分成大约一千个逻辑单元,按特定ID分割。使用MultipleOutputs,因为它应该使用,这导致每个reducer一千个输出,我很好,他们可以稍后合并,但由于MultipleOutput使用一个大的缓冲区每输出我遇到内存问题。我可以通过破解MultipleOutput来缓解这个问题,以便在作业结束之前关闭文件,因为我的地图输出是按照ID排序的,但这并不理想。 – 2014-10-02 12:00:19

回答

1

每个reducer都会生成一个输出文件,更多的是no。还原剂更多的没有。的o/p文件和较小的大小。

可能你可以限制你的号码。的还原剂。 但确保有限减速器得到优化。

例如如果设置redurs = 1,那么只有1个进程必须处理所有映射器数据,因此会增加处理时间。