2011-12-28 73 views
3

我正在使用CompositeInputFormat向hadoop作业提供输入。Hadoop文件拆分:CompositeInputFormat:内部加入

生成的分割数量是作为输入给予CompositeInputFormat(用于加入)的文件总数。

作业完全忽略块大小和最大拆分大小(同时从CompositeInputFormat中获取输入)。这导致长时间运行Map Tasks,并且由于输入文件大于块大小而导致系统变慢。

是否有人知道任何方式可以通过哪些方式为CompositeInputFormat管理分割数量?

回答

6

不幸的是,CompositeInputFormat必须忽略块/拆分大小。在CompositeInputFormat中,需要对输入文件进行排序并进行相同的分区...因此,Hadoop无法确定将文件拆分到何处以维护此属性。它无法确定在哪里分割文件以保持文件的组织。

解决此问题的唯一方法是将文件手动拆分并分割为更小的拆分。您可以通过将数据通过mapreduce作业(可能只是标识映射器和身份缩减器)与更多的reducer进行传递。只要确保使用相同数量的减速器传递两个数据集。

+0

我已经在使用减速器的最大数量。我需要更小块大小的多个地图波。目前,地图任务太大,造成性能问题,有时还会造成任务失败。 – TheHat 2011-12-29 05:39:33

+1

我不认为你正在理解我在说什么。问题是,当使用CompositeInputFormat时,您无法通过输入拆分来分割地图任务。解决这个问题的方法是自己手动分割文件。所以,把你的大文件分割成更小的文件。一种方法是我在第二段中提出的建议。顺便说一下,没有减速器的最大数量这样的事情。 – 2011-12-29 13:04:50

+0

我的输入是一个不同的mapreduce作业的输出。 mapreduce作业的输出文件数量等于所使用的reducer任务的数量。 redcuer任务的最大数量等于集群的reducer任务容量。在这种情况下,运行一个mapreduce作业,然后拆分文件,然后运行另一个mapreduce作业并不适合作为解决方案。 – TheHat 2012-01-02 11:16:10