我已经从旧的(mapred)切换到新的Hadoop api(mapreduce)。我无法在新 API 中设置映射器的数量。我可以使用job.setNumReduceTasks()
来设置化简器的数量,但没有任何方法可以设置映射器的数量。我也尝试了conf.setInt("mapred.map.tasks", numMapper)
和conf.setInt("mapreduce.map.tasks", numMapper)
但它也不起作用。
映射器任务的数量由您拥有的输入拆分决定。显然,每个部分将由 1 个映射器处理。因此,从本质上讲,您的数据决定了映射器的数量!
但是,您可以使用mapreduce.jobtracker.maxtasks.perjob
来限制并行度(不幸的是,这会影响映射器和化简器!但是,如果将其设置为 10,则最多应并行运行 10 个映射器。
更细粒度的控件会很好,但是一个开放票证:
MAPREDUCE-5583:能够限制运行映射并减少任务
从 Hadoop 2.7 开始,您可以使用 mapreduce.job.running.map.limit
和 mapreduce.job.running.reduce.limit
在每个作业级别控制这些内容。
由此JIRA票证修复。
在 YARN 中,可以将 mapreduce.input.fileinputformat.split.minsize(以兆字节为单位)设置为远高于正在读取的文件的块大小。 这将强制更多数据通过每个映射器,从而减少所需的映射器数量。 但是,某些文件格式可能有自己的最小拆分大小,优先于此设置。