2013-07-03 21 views
0

我有一个MapReduce作业,它由包含多行记录的单个输入文件组成。每个记录需要时间的相当数量的时间进行处理。因此,我的输入文件(尽管其大小可能是远小于HDFS块大小)在单个节点上执行时需要大量时间。在节点之间均匀分配重量级任务

如何告诉Hadoop在节点之间均匀有效地分割输入文件?这样即使输入文件很小,它仍然被分成几个并行执行的任务。

另外,我们可以告诉hadoop将文件拆分成N个任务,其中N是可用节点的数量?

谢谢!

编辑: 为了更加清晰,我想要做的是类似于以下内容。我有很多大文件。我有一个外部程序将处理每个文件。每个文件都需要大量时间来处理。

因此,我将文件的文件名存储在输入文件中,然后我希望Hadoop均匀地分割它。然后在映射器中,我将与ID对应的文件复制到本地计算机并调用程序。

回答

0

这个多少钱fair amount of time?看起来你误解了Hadoop。当您启动MR作业时,会有一些初始延迟。这是一个mustunavoidable,无论您的数据是1KB还是1TB。这种延迟是由于像初始化,分割,地图创建等东西而引起的。它不是因为你的文件有多条记录。并处理文件的大小far less than HDFS block size是不会给你任何加。坦率地说,这是对Hadoop的低效使用。

您不必告诉Hadoop什么。该平台足够智能,可以分割文件以获得最大效率。如果你有一个小于块的文件,并且你还在分割它,那么你将进一步降低性能。

您可以告诉Hadoop将文件拆分为N部件,但这并不简单。您必须扩展API并编写您自己的自定义InputFormat以实现此目的,因为分割输入是InputFormat的职责。

但在做这些之前,我建议你阅读一些关于Hadoop的更多内容。另外,请通过这个帖子: http://blog.cloudera.com/blog/2009/02/the-small-files-problem/


在回答你的最后的评论:

如果我理解正确的话,您使用的MR分割保存在“输入文件名”的文件并将该文件复制到本地FS。你是否真的获得了这种方法的主要优势?我的意思是MR在与HDFS等分布式存储系统一起使用时显示出它的强大功能。此外,当您使用MR复制该大文件时,您将丢失数据排序并可能最终导致错误的结果。恕我直言,你最好将这些文件保存在本地FS本身,并使用简单的Java程序拆分包含名称的文件。我没有看到使用Hadoop just as a store的任何一点。

+0

对不起,我的意思是“每个记录**需要**相当长的时间才能处理”。所以基本上每个记录都是存储在其他地方的“某些东西”的ID,处理这个“东西”需要很长时间。我想要有效地并行处理所有“事物”,因此是问题。 – fushar

+1

所以你可以用它的ID来聚合这些“东西”并将它们存储在HDFS上,这会给你一个更大的文件,Hadoop知道如何处理大文件 – darkjh

+0

我同意@darkjh。但是,为了让自己清楚,为什么当你的实际目标是处理与该记录(ID)相关的“某事”时,你担心“记录(ID)”? – Tariq

0

您可以像下面

conf.setNumMapTasks(10); 
    conf.setNumReduceTasks(5); 

您还可以根据使用mapred.max.split.size财产您的需要改变输入分配大小设置的映射,与减速器任务数为您的工作。

+0

谢谢,我按照建议调整'mapred.max.split.size'。 – fushar