0

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

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

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

谢谢!

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

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

4

2 回答 2

0

您可以为您的工作设置映射器和减速器任务的数量,如下所示

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

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

于 2013-07-03T05:23:06.693 回答
0

这是多少fair amount of time?看起来你误解了 Hadoop。启动 MR 作业时会有一些初始延迟。这是一个mustand unavoidable,无论您的数据是 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。你真的通过这种方法获得了任何主要优势吗?我的意思是当与 HDFS 这样的分布式存储一起使用时,MR 显示了它的强大功能。此外,当您使用 MR 复制该大文件时,您将失去数据排序并最终可能会得到错误的结果。恕我直言,您最好将这些文件保存在本地 FS 本身并使用简单的 Java 程序拆分包含名称的文件。我认为使用 Hadoop 没有任何意义just as a store

于 2013-07-03T05:14:23.093 回答