在Hadoop

时间:2015-09-28 06:37:11

标签: java hadoop mapreduce mapper

我的问题是,MapReduce框架(例如Hadoop实现)是否在映射器作业启动之前为映射器分配输入,或者在运行时完成?

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

如果您还在preMapper阶段指出MapReduce的整体拆分机制,我会很高兴。

2 个答案:

答案 0 :(得分:1)

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

使用为数据复制和块大小定义的配置将数据存储到HDFS时,会发生数据拆分(块)。因此,如果原始文件设为 128MB 且块大小为 64MB ,则文件将拆分为两个块。这些块将存储在两台不同的机器上。以下是HDFS design doc:

的引用
  

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

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

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

答案 1 :(得分:1)

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

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

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

可用于执行计算的映射任务数的节点数取决于群集的容量。

例如,假设您的输入文件大小约为100GB(102400 MB),块大小为100MB,输入拆分大小为块大小(默认情况下),则将计算1024个Map任务。在这种情况下,假设您在集群中执行map / reduce任务的集群的最大容器数为500,那么在最好的情况下,并行执行只有500个映射程序。无论哪个执行Map任务容器的机器都会更快地从队列中选择下一个Map任务并继续,直到所有映射器都完成。

希望这会有所帮助。