2

我是 Hadoop 的新手。我已经成功地在伪分布式模式下配置了一个 hadoop 设置。现在我想知道选择map和reduce任务数量的逻辑是什么。我们指的是什么?

谢谢

4

2 回答 2

2

您无法概括如何设置映射器/缩减器的数量。

映射器数量: 您不能将映射器数量显式设置为某个数量(有参数可以设置,但它不会生效)。这取决于hadoop 为您的给定输入集创建的输入拆分数量。您可以通过设置mapred.min.split.size参数来控制它。有关更多信息,请阅读此处的 InputSplit 部分。如果由于大量小文件而生成了大量映射器,并且您希望减少映射器的数量,那么您将需要组合来自多个文件的数据。阅读本文:如何组合输入文件以获取单个映射器并控制映射器数量

引用维基页面:

映射的数量通常由输入文件中 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) 手动增加。这可用于增加 map 任务的数量,但不会设置低于 Hadoop 通过拆分输入数据确定的数量。

减速器数量: 您可以显式设置减速器的数量。只需设置参数mapred.reduce.tasks。有设置这个数字的指南,但通常默认的 reducer 数量应该足够好。有时需要单个报告文件,在这些情况下,您可能希望将 reducer 的数量设置为 1。

再次引用维基:

减少的正确数量似乎是 0.95 或 1.75 * (nodes * mapred.tasktracker.tasks.maximum)。在 0.95 时,所有 reduce 可以立即启动,并在地图完成时开始传输地图输出。在 1.75 时,更快的节点将完成其第一轮 reduce 并启动第二轮 reduce,从而更好地完成负载平衡。

目前,reduce 的数量被输出文件的缓冲区大小限制在大约 1000 个(io.buffer.size * 2 * numReduces << heapSize)。这将在某个时候得到修复,但直到它提供了一个相当稳固的上限。

reduce 的数量还控制输出目录中的输出文件的数量,但通常这并不重要,因为下一个 map/reduce 步骤会将它们拆分为更小的映射拆分。

通过 JobConf 的 conf.setNumReduceTasks(int num),reduce 任务的数量也可以像 map 任务一样增加。

于 2013-05-07T09:22:38.217 回答
0

其实没有。映射器的数量主要受编号控制。由您正在使用的 InputFormat 创建的 InputSplits 和编号。减速器的编号。在映射阶段之后获得的分区数。话虽如此,您还应该记住每个从站可用的插槽数以及可用内存。但根据经验,您可以使用这种方法:

拿号。虚拟 CPU*.75 的数量,这是没有的。您可以配置的插槽数。例如,如果您有 12 个物理核心(或 24 个虚拟核心),那么您将有 (24*.75)=18 个插槽。现在,根据您的要求,您可以选择要使用的映射器和减速器的数量。使用 18 个 MR 插槽,您可以拥有 9 个映射器和 9 个减速器或 12 个映射器和 9 个减速器,或者任何您认为可以的东西。

高温高压

于 2013-05-07T09:06:29.963 回答