0

我有个问题。我想增加我的地图并将函数减少到我的输入数据的数量。当我执行时System.out.println(conf.getNumReduceTasks())System.out.println(conf.getNumMapTasks())它向我显示:

1  1

当我执行conf.setNumReduceTasks(1000000)conf.setNumMapTasks(1000000)再次执行println它向我显示的方法时:

1000000  1000000

但我认为我的 mapreduce 程序执行时间没有变化。我的输入来自 cassandra,实际上是 cassandra 列族行,大约 362000 行。我想将我的 map 和 reduce 函数的数量设置为输入行的数量..

我应该怎么办?

4

1 回答 1

1

为您的 map/reduce 作业设置 map/reduce 任务的数量确实定义了将使用多少个 map/reduce 进程来处理您的作业。考虑一下你是否真的需要这么多 java 进程。

也就是说,地图任务的数量大多是自动确定的;设置map任务数量只是一个提示,可以增加Hadoop确定的map数量。

对于 reduce 任务,默认值为 1,实际限制为 1,000 左右。

见:http ://wiki.apache.org/hadoop/HowManyMapsAndReduces

了解集群的每个节点也有最大数量的可以同时执行的 map/reduce 任务也很重要。这是由以下配置设置设置的:

mapred.tasktracker.map.tasks.maximum 和 mapred.tasktracker.reduce.tasks.maximum

这两个的默认值都是 2。

因此,增加 map/reduce 任务的数量将受限于每个节点可以同时运行的任务数量。这可能是您没有看到工作执行时间发生变化的原因之一。

见:http ://hadoop.apache.org/docs/stable/mapred-default.html

总结就是:让 Hadoop 决定地图的数量,除非你想要更多的地图任务。

使用 mapred.tasktracker..tasks.maximum 设置来控制一次可以运行多少个任务。

reduce 任务数的最大值应该在 1 或 2 * (mapred.tasktracker.reduce.tasks.maximum * #nodes) 之间。您还必须考虑您希望一次运行多少个 map/reduce 作业,以便单个作业不会消耗所有可用的 reduce 槽。

几乎可以肯定,1,000,000 的值对于任何一种设置都太高了。运行那么多java进程是不切实际的。我希望如此高的价值会被忽略。

在将 mapred.tasktracker..tasks.maximum 设置为您的节点能够同时运行的任务数后,然后尝试逐步增加作业的 map/reduce 任务。

您可以在 job.xml 文件中查看作业使用的实际任务数,以验证您的设置。

于 2013-10-05T04:40:22.940 回答