如何限制映射器的数量

时间:2013-10-24 15:42:26

标签: hadoop mapreduce

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

4 个答案:

答案 0 :(得分:6)

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

虽然,应该可以使用mapred-site.xml中的mapred.tasktracker.map.tasks.maximummapred.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决定了地图的数量。

但是,您可以详细了解输入格式