Hadoop 如何决定有多少节点将执行 Map 和 Reduce 任务?

How does Hadoop decide how many nodes will perform the Map and Reduce tasks?

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

资源管理器知道文件在哪里,会把任务发给有数据的节点,但谁说有多少节点来做任务呢? maps donde 之后就是 shuffle,哪个节点做 reduce 任务是由做 hash map 的 partitioner 决定的,对吧?有多少节点会做reduce任务?做过map的节点也会做reduce任务吗?

谢谢。

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

how does Hadoop decides how many nodes will do map tasks

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

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

which nodes will do the reduce tasks?

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

任何作业的默认 reducer 数量为 1。可以在作业配置中设置 reducer 的数量。

有多少张地图?

The number of maps is usually driven by the total size of the inputs, that is, the total number of blocks of the input files.

The right level of parallelism for maps seems to be around 10-100 maps per-node, although it has been set up to 300 maps for very cpu-light map tasks. Task setup takes a while, so it is best if the maps take at least a minute to execute.

如果您有 10TB 的输入数据和 128MB 的块大小,您最终将得到 82,000 张地图,除非 Configuration.set(MRJobConfig.NUM_MAPS, int)(它仅提供提示framework) 用于将其设置得更高。

减少了多少?

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

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

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

减速机NONE

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

Reduce任务有哪些节点?

您可以按照 Configuration parameters 配置每个节点的映射器数量和缩减器数量,例如 mapreduce.tasktracker.reduce.tasks.maximum

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

来源:Map Reduce Tutorial 来自 Apache。

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

编辑:

如何决定哪个Reducer节点?

假设您在两个节点 N1 和 N2 上有相等的可用 reduce 插槽,并且 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