hadoop如何决定将映射和减少任务的节点数量

时间:2015-10-22 13:24:25

标签: hadoop mapreduce hadoop2

我是hadoop的新手,我试图理解它。我正在谈论hadoop 2.当我有一个输入文件我想要做MapReduce时,在MapReduce程序中我说的是Split的参数,所以它会产生与splits一样多的map任务,对吗?

资源管理器知道文件的位置,并将任务发送给拥有数据的节点,但谁说明有多少节点可以执行任务?在地图发出后,有一个shuffle,哪个节点会做一个reduce任务是由做一个哈希映射的分区决定的,对吧?有多少节点可以减少任务?完成地图的节点会减少任务吗?

谢谢。

TLDR:如果我有一个集群并运行MapReduce作业,Hadoop如何确定有多少节点执行映射任务,然后哪些节点将执行reduce任务?

2 个答案:

答案 0 :(得分:2)

有多少地图?

  

地图数量通常由输入的总大小驱动,即输入文件的总块数。

     

地图的正确并行度似乎是每个节点大约10-100个地图,尽管已经为非常cpu-light地图任务设置了300个地图。任务设置需要一段时间,因此最好是地图至少需要一分钟才能执行。

如果您拥有10TB的输入数据和128MB的块大小,那么最终会得到82,000个映射,除非使用Configuration.set(MRJobConfig.NUM_MAPS,int)(仅提供框架提示)来设置它甚至更高。

减少了多少?

正确的减少数量似乎是0.95或1.75乘以(<节点数> *<每个节点的最大容器数>)。

使用0.95时,所有缩减都可以立即启动,并在地图完成后开始传输地图输出。使用1.75,更快的节点将完成第一轮减少并启动第二波减少,从而更好地实现负载平衡。

增加减少的数量会增加框架开销,但会增加负载平衡并降低故障成本。

减速机无

如果不需要减少,将减少任务的数量设置为零是合法的

Reduce任务的哪些节点?

您可以根据{{>> mapreduce.tasktracker.reduce.tasks.maximum

Configuration parameters配置每个节点的映射器数量和减少器数量

如果将此参数设置为零,则不会将该节点视为Reduce任务。否则,群集中的所有节点都有资格执行Reduce任务。

来自Apache的Map Reduce Tutorial

注意:对于给定的作业,您可以设置mapreduce.job.maps& mapreduce.job.reduces。但它可能没有效果。我们应该将决定留给Map Reduce Framework来决定Map&的数量。减少任务

修改

如何确定哪个Reducer节点?

假设您在两个节点N1和N2上具有相等的减少时隙,并且N1上的当前负载> N2,然后,Reduce任务将被分配给N2。如果加载和插槽数量相同,则将第一个心跳发送到资源管理器的任何人都将获得该任务。这是减少分配的代码块:http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hadoop/hadoop-core/0.20.2-320/org/apache/hadoop/mapred/JobQueueTaskScheduler.java#207

答案 1 :(得分:1)

  

Hadoop如何确定将执行地图任务的节点数

默认情况下,映射器的数量与mapreduce输入的分割(块)数相同。

现在关于节点,在Hadoop 2中,每个节点都运行它自己的NodeManager(NM)。 NM的工作是管理由Resourcemanager(RM)分配给它的应用程序容器。所以基本上,每个任务都将在单个容器中运行。要运行映射器任务,ApplicationMaster将从ResourceManager协商容器。分配容器后,NodeManager将启动任务并对其进行监控。

  

哪些节点会执行reduce任务?

reduce任务也将在容器中运行。 ApplicationMaster(每个应用程序(作业))将从RM协商容器并启动reducer任务。大多数情况下,它们运行在不同的节点上,然后运行Mapper节点。

任何作业的默认减速机数量为1.可以在作业配置中设置减速机数量。