2015-09-28 62 views
0
映射器

我的问题是,不MapReduce框架(如Hadoop实现),指定的输入,映射器映射作业开始,或者是在运行时之前完成?输入分配Hadoop中

也就是说,假设我有一些输入i,和机器m_1,m_2 .. m_k。这些机器不需要同样的供电,有些机器可能比其他机器具有更好的性能(CPU,内存)。如果主节点将映射器的输入拆分为映射器任务,或者至少将输入分配给特定映射器节点,则可能会出现某些机器(更强大的机器)可以完成其工作并等待的情况。但是,如果拆分作业在运行时完成,则不会出现此问题。

如果您也表明,preMapper阶段MapReduce整体分割机构,我会很高兴。

回答

1

MapReduce框架中,根据数据位置概念Mapper任务分配给机器。这意味着,将存储数据块的数据节点分配给该数据块执行映射器任务。

的数据分片,当您使用用于数据复制和块大小定义的配置中的数据存储到HDFS(块)发生。所以,如果原始文件是说128MB和块大小是64MB然后文件将被拆分成两个块。这些块将存储在两台不同的机器上。这里是从HDFS design文档中引用的文档:

HDFS使用的典型块大小为64 MB。因此,HDFS文件被分成64 MB的块,如果可能的话,每个块将驻留在不同的DataNode上。

现在,当为特定文件运行MapReduce作业时,将在这两台机器上启动两个Mapper任务。

因此,映射器的数据拆分和启动完全是两个独立的事情。第一个是由HDFS框架处理,第二个是由MapReduce框架处理。

+0

谢谢你的回答。所以,从你说的话来看,如果我有5台mapper,并且数据存储在2台机器上的HDFS(使用你给出的配置),那么剩下的3台mapper将不会做任何事情? –

+1

@JeyhunKarimov他们将只在这些机器上启动。可能会按顺序排列。它将取决于配置,一台机器允许一次运行多少个映射器或减速器。 – YoungHobbit

+0

我不关心那些有本地数据和启动映射器的机器。根据你的回答,我担心没有本地数据的其他机器无法启动映射器。我们可以做些什么来克服这个问题? –

1

是的,Map任务的输入是在Mapper阶段在Hadoop中启动之前准备的。映射器的数量由Mapper阶段开始之前给定输入文件计算的Input Splits的数量决定。

这里的Input Split是给定输入文件的逻辑块,在默认情况下,每个文件块都会准备一个输入分割,并且为每个输入分割一个映射器任务将被分派。

您可以通过控制mapreduce.input.fileinputformat.split.maxsizemapreduce.input.fileinputformat.split.minsize属性来控制InputSplits的数量。

可供执行的任务地图计算出的数量为节点的数量取决于群集的能力。

例如,假设您的输入文件大小和块大小100MB约为100GB(102400 MB),并输入分割大小是块的大小(默认设置),则1024个Map任务将被计算。在这种情况下,假设您在群集中可用于执行映射/减少任务的群集的最大容器数为500,那么在最佳情况下,只有500个映射器将在并行中执行。更早执行Map任务容器的机器将从队列中选择下一个Map任务,并继续执行,直到完成所有映射器为止。

希望这有助于。

+0

谢谢你的回答。因此,机器执行队列中的任务,并且当机器中的本地数据完成处理时队列为空。那之后,机器什么也不做,等待。如果我错了,请纠正我。 –

+1

如果任务容器已完成执行给定任务,他们将释放该插槽并向作业跟踪器报告其可用性以执行新任务,他们将分配给执行任何其他作业的地图任务或运行先前执行的工作的减速器。 – sureshsiva