我使用 conf.setNumMapTasks()
显式指定 Java 程序中的映射器数量,但是当作业结束时,计数器显示启动的映射任务的数量超过了指定的值。如何将映射器的数量限制为指定值?
根据Hadoop API,Jonf.setNumMapTasks只是对Hadoop运行时的一个提示。地图任务的总数等于输入数据中要处理的块数。
虽然,应该可以通过使用 mapred-site.xml 中的mapred.tasktracker.map.tasks.maximum
和mapred.tasktracker.reduce.tasks.maximum
来配置每个节点的映射/减少插槽的数量。通过这种方式,可以配置在整个集群中并行执行的映射器/化简器的总数。
使用conf.setNumMapTasks(int num)
可以增加映射器的数量,但不能减少。不能将映射器的数量显式设置为小于 Hadoop 计算的映射器数量的某个数量。这取决于Hadoop为给定的输入集创建的输入拆分数量。您可以通过设置 mapred.min.split.size parameter
来控制这一点。
引用维基页面:
映射的数量通常由 DFS 块的数量驱动 输入文件。虽然这会导致人们调整他们的DFS块 大小以调整地图数量。适当的并行级别 地图似乎大约是 10-100 张地图/节点,尽管我们已经接受了它 到 300 左右,用于非常轻的 CPU 映射任务。任务设置需要一段时间,因此 最好是地图至少需要一分钟才能执行。
实际上控制地图的数量是微妙的。这 mapred.map.tasks 参数只是对 InputFormat 的提示。 地图数量。默认的输入格式行为是拆分总计 字节数转换为正确数量的片段。然而,在 默认情况下,输入文件的 DFS 块大小被视为 输入拆分的上限。拆分大小的下限可以是 通过mapred.min.split.size设置。因此,如果您期望 10TB 的输入数据 并且拥有 128MB DFS 块,您最终将获得 82k 张地图,除非您 mapred.map.tasks甚至更大。最终,输入格式决定 地图的数量。
地图任务的数量也可以使用 JobConf's conf.setNumMapTasks(int num).这可用于增加 映射任务的数量,但不会将数字设置为低于哪个 Hadoop通过拆分输入数据来确定。
JobConf#setNumMapTasks() 的 javadoc
:注意:这只是对框架的提示。实际数量 生成的地图任务取决于生成的
InputSplit
数 工作InputFormat.getSplits(JobConf, int)
.自定义InputFormat
是 通常用于精确控制 工作。
Hadoop 还会重新启动失败或长时间运行的映射任务,以提供高可用性。
您可以限制在单个节点上同时运行的映射任务数。您可以限制启动任务的数量,前提是您有较大的输入文件。您必须编写自己的 InputFormat
类,该类不可拆分。然后,Hadoop将为您拥有的每个输入文件运行一个映射任务。
根据 [将您的作业划分为地图和化简],如下所示:
mapred.map.tasks 参数只是对映射数量的 InputFormat 的提示。默认的 InputFormat 行为是将字节总数拆分为正确数量的片段。但是,在默认情况下,输入文件的 DFS 块大小被视为输入拆分的上限。拆分大小的下限可以通过mapred.min.split.size设置。因此,如果你期望10TB的输入数据并拥有128MB的DFS块,你最终会得到82k个地图,除非你的mapred.map.tasks更大。最终,输入格式决定了映射的数量。
但是,您可以了解有关 输入格式 的更多信息 .