【问题标题】:How does Hadoop decide how many nodes will perform the Map and Reduce tasks?Hadoop 如何决定有多少节点将执行 Map 和 Reduce 任务?
【发布时间】:2019-06-09 07:58:32
【问题描述】:

我是 hadoop 新手,我正在努力理解它。我说的是hadoop 2。当我有一个想要做MapReduce的输入文件时,在MapReduce程序中我说的是Split的参数,所以它会做尽可能多的map任务,对吧?

资源管理器知道文件在哪里,并将任务发送到拥有数据的节点,但谁说有多少节点将执行任务?在映射完成后,有一个 shuffle,哪个节点将执行 reduce 任务由执行哈希映射的分区器决定,对吗?有多少节点会做reduce任务?做过map的节点会不会做reduce任务?

谢谢。

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

【问题讨论】:

  • 具体问一下,你有什么疑问。这太模糊了。
  • 如果我有一个集群并且我运行一个 MapReduce 作业,Hadoop 如何决定有多少节点将执行 map 任务,然后哪些节点将执行 reduce 任务?
  • 更新相同的问题。
  • Eric - 根据您的查询也更新问题标题

标签: hadoop mapreduce hadoop2


【解决方案1】:

有多少地图?

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

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

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

减少了多少?

reduce 的正确数量似乎是 0.95 或 1.75 乘以( * )。

对于 0.95,所有 reduce 都可以立即启动,并在地图完成时开始传输地图输出。在 1.75 中,更快的节点将完成他们的第一轮 reduce 并启动第二波 reduce,从而更好地完成负载平衡。

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

减速器无

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

Reduce 任务的哪些节点?

您可以根据Configuration parameters 配置每个节点的映射器数量和减速器数量,例如 ma​​preduce.tasktracker.reduce.tasks.maximum

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

来源:来自 Apache 的 Map Reduce Tutorial

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

编辑:

如何决定哪个Reducer节点?

假设您在两个节点 N1 和 N2 上具有相等的可用 reduce 插槽,并且 N1 > N2 上的当前负载,那么,Reduce 任务将分配给 N2。如果负载和槽数都相同,那么首先向资源管理器发送心跳的人将获得任务。这是reduce赋值的代码块: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

【讨论】:

  • 好的,谢谢,那么如何确定哪个节点将执行 reduce 工作?随机?我的意思是 hadoop 如何分配节点将要减少的“密钥”。
  • 这取决于节点上的负载和该节点中可用的 reduce slot 的数量。
  • 是的,但我想知道的是他如何决定将reduce任务发送到哪个节点,就像您有10个节点和5个已经完成map任务一样,他如何决定将不同的reduce发送到哪里跨集群的任务?
  • 假设你在两个节点 N1 和 N2 上有相等的 reduce slots 可用并且 N1 > N2 上的当前负载,那么,Reduce 任务将分配给 N2。如果负载和槽数都相同,那么首先向资源管理器发送心跳的人将获得任务。这是减少赋值的代码块:grepcode.com/file/repository.cloudera.com/content/repositories/…
  • @Ravindrababu 我没有得到一点。 MapTask 在容器内运行或将整个容器分配给一个 MapTask。谢谢。
【解决方案2】:

Hadoop 如何决定有多少节点将执行映射任务

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

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

哪些节点将执行reduce任务?

reduce 任务也将在容器中运行。 ApplicationMaster (per-application (job)) 将从 RM 协商容器并启动 reducer 任务。大多数情况下,它们在不同的节点上运行,然后是 Mapper 节点。

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

【讨论】:

  • 但是每个节点做的不仅仅是地图任务,对吧?那么hadoop是如何决定总共有多少节点来完成这项工作的呢?谢谢
  • @Eric 任务在容器中执行,不在节点中。单个节点可以支持多个容器。具有可用 CPU 和内存的节点将被分配作业。
猜你喜欢
  • 2011-08-06
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2014-04-09
  • 2014-03-21
  • 2011-01-20
相关资源
最近更新 更多