2013-05-07 69 views

回答

0

其实没有。 mappers主要由no。由您正在使用的InputFormat创建的InputSplits和No。的减少者的否。您在地图阶段后获得的分区。话虽如此,你还应该记住插槽的数量,每个从机可用,以及可用内存。但作为一个经验法则,你可以使用这种方法:

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

HTH

2

你不能一概而论如何映射器的数量/减速将被设定。

映射器数量: 您不能将映射器数量明确设置为某个数(有些参数可以设置它,但它不会生效)。这是由hadoop为您给定的一组输入创建的输入拆分的数量决定的。您可以通过设置mapred.min.split.size参数来控制此设置。有关更多信息,请参阅InputSplit部分here。如果由于大量小文件而产生大量映射器,并且想要减少映射器的数量,那么您将需要合并来自多个文件的数据。阅读:How to combine input files to get to a single mapper and control number of mappers

从wiki页面引用:

地图的数量通常是由DFS块的数量 输入文件驱动。虽然这会导致人们调整DFS块的大小 来调整地图的数量。 地图的平行度的正确水平似乎大约为10-100地图/节点,尽管我们已经将它用于非常cpu光地图任务的 至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设置这个数字,但通常减少的默认数量应该足够好。有时需要一个单一的报表文件,在这些情况下,您可能要减速的数量被设置为1。

再从维基报价:

减少了正确的号码似乎是0.95或1.75 *(节点* mapred.tasktracker.tasks.maximum)。在0.95处,所有的缩减可以立即启动并开始传输地图输出,如地图 完成。在1.75更快的节点将完成他们的第一轮 减少和发起第二轮减少做一个更好的工作 的负载平衡。

目前减少的数量由用于输出文件的 缓冲器大小(io.buffer.size * 2 * numReduces < < HEAPSIZE)限定于大致1000。这将在某些时候被固定,但直到它 提供了一个非常坚定的上限。

减少的数量还控制着输出目录中的输出文件的数量,但通常这并不重要,因为下一步的 map/reduce步骤会将它们分割成更小的分割图。

减少任务的数量也可以通过JobConf的conf.setNumReduceTasks(int num)以与地图任务 相同的方式增加。