我在我的 java 程序中使用 明确指定映射器的数量conf.setNumMapTasks()
,但是当作业结束时,计数器显示启动的映射任务的数量超过了指定的值。如何将mapper的数量限制为指定值?
4 回答
根据 Hadoop API,Jonf.setNumMapTasks只是 Hadoop 运行时的一个提示。map 任务的总数等于输入数据中要处理的块数。
虽然,应该可以通过使用mapred-site.xml 中的mapred.tasktracker.map.tasks.maximum
和来配置每个节点的 map/reduce 槽数。mapred.tasktracker.reduce.tasks.maximum
这样就可以配置在整个集群中并行执行的映射器/减速器的总数。
使用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 通过拆分输入数据确定的数量。
引用JobConf#setNumMapTasks()的javadoc :
注意:这只是对框架的提示。实际生成的 map 任务数量取决于
InputSplit
作业生成的 s数量InputFormat.getSplits(JobConf, int)
。自定义InputFormat
通常用于准确控制作业的地图任务数量。
Hadoop 还重新启动失败或长时间运行的地图任务以提供高可用性。
您可以限制在单个节点上同时运行的 map 任务的数量。如果您有大输入文件,您可以限制启动任务的数量。您必须编写一个自己的InputFormat
类,该类不可拆分。然后 Hadoop 将为您拥有的每个输入文件运行一个映射任务。
根据[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的更多信息。