我使用conf.setNumMapTasks()
在我的java程序中明确指定了映射器的数量,但是当作业结束时,计数器显示已启动的映射任务的数量超过了指定的值。如何将映射器的数量限制为指定值?
答案 0 :(得分:6)
根据Hadoop API Jonf.setNumMapTasks只是对Hadoop运行时的提示。映射任务的总数等于要处理的输入数据中的块数。
虽然,应该可以使用mapred-site.xml中的mapred.tasktracker.map.tasks.maximum
和mapred.tasktracker.reduce.tasks.maximum
来配置每个节点的map / reduce插槽数。这样就可以配置在整个集群中并行执行的映射器/缩减器的总数。
答案 1 :(得分:2)
使用conf.setNumMapTasks(int num)
可以增加映射器的数量但不能减少。
您不能将映射器的数量明确设置为某个数字,该数字小于Hadoop计算的映射器数量。这取决于hadoop为您给定的输入集创建的输入拆分数。您可以通过设置mapred.min.split.size parameter
。
引用wiki页面:
地图数量通常由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)。这可以用来增加 地图任务的数量,但不会设置下面的数字 Hadoop通过拆分输入数据来确定。
答案 2 :(得分:1)
引用JobConf#setNumMapTasks()的javadoc:
注意:这只是对框架的一个提示。实际数量 衍生的地图任务取决于生成的
InputSplit
的数量 这份工作是InputFormat.getSplits(JobConf, int)
。自定义InputFormat
是 通常用于精确控制地图任务的数量 工作
Hadoop还会重新启动失败或长时间运行的地图任务,以提供高可用性。
您可以限制在单个节点上同时运行的地图任务的数量。如果您有大量输入文件,则可以限制已启动任务的数量。您必须编写一个不可拆分的自己的InputFormat
类。然后,Hadoop将为您拥有的每个输入文件运行一个map任务。
答案 3 :(得分:0)
根据 [Partitioning your job into maps and reduces],如下:
mapred.map.tasks参数只是输入地图数量的一个提示。默认的InputFormat行为是将总字节数拆分为正确数量的片段。但是,在默认情况下,输入文件的DFS块大小被视为输入拆分的上限。可以通过mapred.min.split.size设置拆分大小的下限。因此,如果您期望10TB的输入数据并具有128MB的DFS块,那么除非mapred.map.tasks更大,否则最终会得到82k的映射。最终,InputFormat决定了地图的数量。
但是,您可以详细了解输入格式。