我是Hadoop的新手。我已经在伪分布式模式下成功配置了hadoop设置。现在我想知道选择map和reduce任务数量的逻辑是什么。我们指的是什么?
由于
答案 0 :(得分:2)
您无法概括如何设置映射器/缩减器的数量。
Mappers数量:
您不能明确地将映射器的数量设置为特定数量(有设置此参数的参数但它不会生效)。这取决于hadoop为您给定的输入集创建的输入拆分的数量。您可以通过设置mapred.min.split.size
参数来控制此操作。有关更多信息,请阅读InputSplit部分here。如果由于大量小文件而生成了大量的映射器,并且您希望减少映射器的数量,那么您将需要组合来自多个文件的数据。请阅读:How to combine input files to get to a single mapper and control number of mappers。
引用维基页面:
地图数量通常由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)。这可以用来增加 地图任务的数量,但不会设置下面的数字 Hadoop通过拆分输入数据来确定。
减速机数量:
您可以显式设置减速器的数量。只需设置参数mapred.reduce.tasks
即可。有guidelines用于设置此数字,但通常默认的减速器数量应该足够好。有时需要单个报告文件,在这些情况下,您可能希望将多个Reducer设置为1.
再次引用wiki:
正确的减少数量似乎是0.95或1.75 *(节点* mapred.tasktracker.tasks.maximum)。在0.95时,所有减少都可以 立即启动并开始将地图输出作为地图传输 完。在1.75,更快的节点将完成他们的第一轮 减少并启动第二轮减少做得更好的工作 负载平衡。
目前减少的数量被限制在1000左右 输出文件的缓冲区大小(io.buffer.size * 2 * numReduces<< HEAPSIZE)。这将在某个时候修复,但直到它 提供了一个相当坚定的上限。
reduce的数量也控制着输出文件的数量 输出目录,但通常不重要,因为下一个 map / reduce步骤会将它们分割成更小的地图分割。
还可以以相同的方式增加减少任务的数量 地图任务,通过JobConf的conf.setNumReduceTasks(int num)。
答案 1 :(得分:0)
其实没有。 mappers的主要是由no。您正在使用的InputFormat创建的InputSplits和no。减速机的数量在地图阶段之后获得的分区。话虽如此,你还应该记住每个奴隶可用的插槽数量,以及可用内存。但根据经验,你可以使用这种方法:
拿不了。虚拟CPU * .75,这是没有。您可以配置的插槽。例如,如果您有12个物理核心(或24个虚拟核心),则您将拥有(24 * .75)= 18个插槽。现在,根据您的要求,您可以选择要使用的映射器和缩减器数量。使用18个MR插槽,您可以拥有9个映射器和9个减速器或12个映射器和9个减速器或您认为可以随意使用的任何内容。
HTH