我是hadoop的新手,我正在努力理解它。我说的是hadoop 2。当我有一个输入文件,我想做一个MapReduce,在MapReduce程序中,我输入Split的参数,它会生成和Split一样多的map任务,对吧?
资源管理器知道文件在哪里,并将任务发送给拥有数据的节点,但是谁说有多少节点将执行这些任务呢?映射完成后是shuffle,哪个节点执行reduce任务是由执行散列映射的分区者决定的,对吧?有多少节点会执行reduce任务?做过地图的节点会减少任务吗?
谢谢。
TLDR:如果我有一个集群,我运行一个MapReduce作业,Hadoop如何决定有多少节点将执行map任务,然后哪些节点将执行reduce任务?
有多少张地图?
映射的数量通常由输入文件的总大小决定,即输入文件的块总数。
地图的正确并行度似乎是每个节点大约10-100个地图,尽管对于cpu非常轻的地图任务,它已经设置为300个地图。任务设置需要一段时间,所以映射最好至少花一分钟来执行。
如果您有10TB的输入数据和128MB的块大小,那么您将最终得到82,000个映射,除非Configuration.set(MRJobConfig. conf)。NUM_MAPS, int)(它只向框架提供一个提示)用于设置更高的值。
有多少个减少?
正确的减少次数似乎是0.95或1.75乘以(<不。节点> * <不。每个节点的最大容器数>)。
使用0.95时,所有的reduce都可以立即启动,并在地图完成时开始传输地图输出。在1.75版本中,更快的节点将完成第一轮的reduce,并启动第二波的reduce,从而更好地实现负载平衡。
增加reduce的数量会增加框架开销,但会增加负载平衡并降低故障成本。
减速机没有
如果不需要reduce,则将reduce-task的数量设置为0是合法的
哪些节点用于Reduce任务?
您可以根据mapreduce.tasktracker.reduce.tasks.maximum
等配置参数配置每个节点的映射器数量和reducer数量。如果您将此参数设置为零,则该节点将不会被考虑用于Reduce任务。否则,集群中的所有节点都有资格执行Reduce任务。
来源:Map Reduce Tutorial from Apache.
注:对于给定的Job,可以设置mapreduce.job.maps &mapreduce.job.reduces。但它可能没有效果。我们应该把决策留给Map Reduce框架来决定Map &减少任务
编辑:如何确定哪个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
Hadoop如何决定有多少节点执行map任务
默认情况下,映射器的数量将与mapreduce输入的分割(块)数量相同。
现在关于节点,在Hadoop 2中,每个节点运行自己的NodeManager
(NM)。NM的工作是管理Resourcemanager
(RM)分配给它的应用程序容器。所以基本上,每个任务都将在单独的容器中运行。为了运行映射器任务,ApplicationMaster
与ResourceManager
协商容器。一旦分配了容器,NodeManager
将启动任务并监视它。
哪些节点将执行reduce任务?
同样,reduce任务也将在容器中运行。ApplicationMaster
(每个应用程序(作业))将与RM协商容器并启动reducer任务。大多数情况下,它们在不同的节点上运行,然后在Mapper节点上运行。
任何作业的默认减速器数为1。可在作业配置中设置减速器的数量。