3

我在我的 java 程序中使用 明确指定映射器的数量conf.setNumMapTasks(),但是当作业结束时,计数器显示启动的映射任务的数量超过了指定的值。如何将mapper的数量限制为指定值?

4

4 回答 4

6

根据 Hadoop API,Jonf.setNumMapTasks只是 Hadoop 运行时的一个提示。map 任务的总数等于输入数据中要处理的块数。

虽然,应该可以通过使用mapred-site.xml 中的mapred.tasktracker.map.tasks.maximum和来配置每个节点的 map/reduce 槽数。mapred.tasktracker.reduce.tasks.maximum这样就可以配置在整个集群中并行执行的映射器/减速器的总数。

于 2013-10-24T16:57:56.183 回答
2

使用conf.setNumMapTasks(int num)映射器的数量可以增加但不能减少。您不能将映射器的数量显式设置为小于 Hadoop 计算的映射器数量的特定数量。这取决于 hadoop 为您的给定输入集创建的输入拆分数量。您可以通过设置来控制它mapred.min.split.size parameter

引用维基页面:

映射的数量通常由输入文件中 DFS 块的数量决定。虽然这会导致人们调整他们的 DFS 块大小以调整地图的数量。地图的正确并行度水平似乎在 10-100 个地图/节点左右,尽管对于非常 cpu-light 的地图任务,我们已将其提高到 300 左右。任务设置需要一段时间,因此最好至少花费一分钟来执行地图。

实际上控制地图的数量是微妙的。mapred.map.tasks 参数只是对 InputFormat 地图数量的提示。默认的 InputFormat 行为是将总字节数拆分为正确数量的片段。但是,在默认情况下,输入文件的 DFS 块大小被视为输入拆分的上限。可以通过 mapred.min.split.size 设置拆分大小的下限。因此,如果您期望 10TB 的输入数据和 128MB 的 DFS 块,那么您最终会得到 82k 个地图,除非您的 mapred.map.tasks 更大。最终,InputFormat 决定了地图的数量。

地图任务的数量也可以使用 JobConf 的 conf.setNumMapTasks(int num) 手动增加。这可用于增加 map 任务的数量,但不会设置低于 Hadoop 通过拆分输入数据确定的数量。

于 2013-10-24T17:45:55.980 回答
1

引用JobConf#setNumMapTasks()的javadoc :

注意:这只是对框架的提示。实际生成的 map 任务数量取决于InputSplit作业生成的 s数量InputFormat.getSplits(JobConf, int)。自定义InputFormat通常用于准确控制作业的地图任务数量。

Hadoop 还重新启动失败或长时间运行的地图任务以提供高可用性。

您可以限制在单个节点上同时运行的 map 任务的数量。如果您有大输入文件,您可以限制启动任务的数量。您必须编写一个自己的InputFormat类,该类不可拆分。然后 Hadoop 将为您拥有的每个输入文件运行一个映射任务。

于 2013-10-24T17:01:36.897 回答
0

根据[Partitioning your job into maps and reduce],如下:

mapred.map.tasks 参数只是对 InputFormat 地图数量的提示。默认的 InputFormat 行为是将总字节数拆分为正确数量的片段。但是,在默认情况下,输入文件的 DFS 块大小被视为输入拆分的上限。可以通过 mapred.min.split.size 设置拆分大小的下限。因此,如果您期望 10TB 的输入数据和 128MB 的 DFS 块,那么您最终会得到 82k 个地图,除非您的 mapred.map.tasks 更大。最终,InputFormat 决定了地图的数量。

但是,您可以了解有关InputFormat的更多信息。

于 2016-01-19T14:54:29.643 回答