我的hadoop版本是1.0.2。现在我希望最多有10个地图任务同时运行。我发现了两个与这个问题相关的变量。
) 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)中使用配置参数maxMaps设置池的最大并发任务槽。然后,当您提交作业时,只需将作业的队列设置为相应的池。
您可以将mapred.jobtracker.maxtasks.per.job
的值设置为-1以外的值(默认值)。这限制了一个作业可以同时使用的map或reduce任务的数量。
这个变量描述为:
单个作业的最大任务数。-1表示无最大值。
我认为有计划将mapred.max.maps.per.node
和mapred.max.reduces.per.node
添加到作业配置中,但它们从未发布。
如果您使用的是Hadoop 2.7或更新版本,您可以使用mapreduce.job.running.map.limit
和mapreduce.job.running.reduce.limit
来限制每个作业级别的映射和减少任务。
mapred.tasktracker.map.tasks。Maximum是用于限制一次可以运行的映射任务数量的属性。在mapred-site.xml中配置它。
参见http://wiki.apache.org/hadoop/FAQ
触发的映射器数量由输入块大小决定。输入块大小是数据块的大小,当从HDFS读取数据时,数据被划分并发送到不同的映射器。因此,为了控制映射器的数量,我们必须控制块大小。
在MapReduce中配置作业时,可以通过设置参数mapred.min.split.size
和mapred.max.split.size
来控制。以字节为单位设置。因此,如果我们有一个20 GB的文件,并且我们想要触发40个映射器,那么我们需要将其设置为每个20480/40 = 512 MB。所以代码应该是,
conf.set("mapred.min.split.size", "536870912");
conf.set("mapred.max.split.size", "536870912");
其中conf
是org.apache.hadoop.conf.Configuration
类的对象
阅读Hadoop中的调度作业(例如"fair scheduler")。您可以创建具有多个配置的自定义队列,然后将作业分配给该队列。如果您将自定义队列最大映射任务限制为10,则每个分配给队列的作业最多将有10个并发映射任务。