如何限制并发运行的map任务?

时间:2013-01-17 14:06:07

标签: map hadoop mapreduce task jobs

我的hadoop版本是1.0.2。现在我想要同时运行10个地图任务。我找到了与此问题相关的2个变量。

a)mapred.job.map.capacity

但在我的hadoop版本中,此参数似乎已被放弃。

b)mapred.jobtracker.taskScheduler.maxRunningTasksPerJob(http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.collector/1.0.2/mapred-default.xml)< / p>

我将此变量设置如下:

Configuration conf = new Configuration();
conf.set("date", date);
conf.set("mapred.job.queue.name", "hadoop");
conf.set("mapred.jobtracker.taskScheduler.maxRunningTasksPerJob", "10");

DistributedCache.createSymlink(conf);
Job job = new Job(conf, "ConstructApkDownload_" + date);
...

问题在于它不起作用。作业开始时,仍有超过50张地图正在运行。

查看hadoop文档后,我找不到另一个来限制并发运行的map任务。 希望有人可以帮助我,谢谢。

=====================

我找到了关于这个问题的答案,在这里与其他可能感兴趣的人分享。

使用公平调度程序,使用配置参数maxMaps在分配文件(fair-scheduler.xml)中设置池的最大并发任务位。 然后,当您提交作业时,只需将作业的队列设置为相应的池。

5 个答案:

答案 0 :(得分:5)

您可以将mapred.jobtracker.maxtasks.per.job的值设置为-1以外的值(默认值)。这限制了作业可以使用的同时映射或减少任务的数量。

此变量描述为:

  

单个作业的最大任务数。值-1表示没有最大值。

我认为有计划将mapred.max.maps.per.nodemapred.max.reduces.per.node添加到工作配置中,但他们从未将其发布。

答案 1 :(得分:3)

如果您使用的是Hadoop 2.7或更高版本,则可以使用mapreduce.job.running.reduce.limit和{{1}}限制每个作业级别的地图和减少任务。

修复JIRA ticket

答案 2 :(得分:1)

mapred.tasktracker.map.tasks.maximum是用于限制一次可以运行的地图任务数的属性。在mapred-site.xml中配置它。

参考http://wiki.apache.org/hadoop/FAQ

中的2.7

答案 3 :(得分:0)

触发的映射器数量由输入块大小决定。输入块大小是在从HDFS读取数据时将数据划分并发送到不同映射器的块的大小。因此,为了控制映射器的数量,我们必须控制块大小。

可以通过设置参数mapred.min.split.sizemapred.max.split.size来控制,同时在MapReduce中配置作业。该值将以字节为单位进行设置。因此,如果我们有一个20 GB的文件,并且我们想要触发40个映射器,那么我们需要将它们设置为20480/40 = 512 MB。所以代码就是,

conf.set("mapred.min.split.size", "536870912");
conf.set("mapred.max.split.size", "536870912");

其中conforg.apache.hadoop.conf.Configuration类的对象。

答案 4 :(得分:0)

了解Hadoop中的调度作业(例如&#34;公平调度程序&#34;)。您可以使用多个配置创建自定义队列,然后将作业分配给该队列。如果将自定义队列最大映射任务限制为10,那么最多分配给队列的每个作业将具有10个并发映射任务。