在节点之间均匀分配重量级任务

时间:2013-07-03 04:23:39

标签: hadoop mapreduce hdfs

我有一个MapReduce作业,它由一个包含几行记录的输入文件组成。每条记录都需要相当长的时间进行处理。因此,我的输入文件虽然其大小可能<远>小于HDFS块大小,但在单个节点上执行时会花费大量时间。

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

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

谢谢!

编辑: 为了更清楚,我想要做的是如下所示。我有很多大文件。我有一个外部程序,它将处理每个文件。每个文件都需要花费大量时间进行处理。

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

2 个答案:

答案 0 :(得分: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没有任何意义。

答案 1 :(得分:0)

您可以为您的工作设置mapper和reducer任务的数量,如下所示

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

您也可以使用mapred.max.split.size属性根据需要更改输入分割大小。