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

如何限制并发运行的map任务?,map,hadoop,mapreduce,task,jobs,Map,Hadoop,Mapreduce,Task,Jobs,我的hadoop版本是1.0.2。现在我希望最多10个地图任务同时运行。我发现了与这个问题相关的两个变量 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-

我的hadoop版本是1.0.2。现在我希望最多10个地图任务同时运行。我发现了与这个问题相关的两个变量

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)

我将此变量设置如下:

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任务的方法。 希望有人能帮助我,谢谢

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

我已经找到了这个问题的答案,在这里分享给其他可能感兴趣的人

在分配文件(fair scheduler.xml)中,使用带有配置参数maxmap的fair scheduler设置池的最大并发任务插槽。
然后在提交作业时,只需将作业的队列设置为相应的池。

mapred.tasktracker.map.tasks.max是限制一次可以运行的映射任务数的属性。在mapred-site.xml中配置它


参见

中的2.7,触发的映射器数量由输入块大小决定。输入块大小是从HDFS读取数据时,数据被分割并发送到不同映射器的块的大小。所以为了控制映射器的数量,我们必须控制块的大小

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

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

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

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

该变量描述为:

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


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

如果您使用的是Hadoop 2.7或更高版本,您可以使用
mapreduce.job.running.map.limit
mapreduce.job.running.reduce.limit
在每个作业级别限制map和reduce任务


修复。

阅读Hadoop中的调度作业(例如“fair scheduler”)。您可以创建具有多个配置的自定义队列,然后将作业分配给该队列。如果将自定义队列最大映射任务限制为10,则分配给队列的每个作业最多将有10个并发映射任务。

为什么要尝试这样做?如果动机是在集群上公平地分配资源,那么您应该尝试使用FairScheduler。因为在映射阶段,我将从外部数据源读取一些内容。我不想同时有太多的连接。你能在本地下载你想要的数据吗?然后,您可以在启动作业时发送该数据文件,而不必担心映射器计数。我认为此变量控制的是“在一个tasktracker中”而不是“在一个作业中”运行的映射任务数。此参数的说明:任务跟踪器将同时运行的映射任务的最大数量。@HaiWang:从我阅读您的原始问题来看,
mapred.tasktracker.map.tasks.max
解决了这个问题:它不控制映射器的总数,但控制同时运行的映射器的数量。因此,它不会影响作业的逻辑或粒度,而是影响资源的使用率。我也遇到了同样的问题,这个参数对我很有效(比设置公平调度程序更容易)。他说的是限制并发运行的map任务的数量,而不是Hadoop 2.7.2中规定的map任务总数,替换为
mapreduce.jobtracker.maxtasks.perjob
(),同时仔细阅读说明,我不确定这是否是同时执行任务的限制。这实际上可能是对总任务的限制。还有另一个属性
mapreduce.jobtracker.taskscheduler.maxrunningtasks.perjob
被描述为“一个作业被抢占前的最大运行任务数。”