我的问题是,MapReduce框架(例如Hadoop实现)是否在mapper作业开始之前或在运行时完成为mapper分配输入?
也就是说,假设我有一些输入i
,机器m_1,m_2 .. m_k
。机器不需要同等的动力,有些机器可能比其他机器有更好的性能(CPU,内存)。如果主节点将输入分割到映射器,直到映射器任务开始,或者至少将输入分配给特定的映射器节点,则可能存在某些机器(较强的机器)可以完成它们的工作并等待的情况。但是,如果在运行时完成拆分作业,则不会出现此问题。
如果你还能指出preMapper阶段MapReduce
的整体分裂机制,我会很高兴。
在MapReduce
框架中,Mapper
任务是基于数据局部性概念分配给机器的。这意味着,存储数据块的数据节点将被分配执行该数据块的映射器任务。
当您使用为数据复制和块大小定义的配置将数据存储到HDFS
中时,会发生数据分割(块)。所以如果原始文件是128MB,块大小是64MB,那么文件将被分成两个块。这些块将存储在两台不同的机器上。以下是引用自HDFS设计文档:
HDFS使用的典型块大小为64mb。因此,HDFS文件被切成64mb的块,如果可能的话,每个块将驻留在不同的DataNode上。
现在,当运行MapReduce
作业时,两个Mapper
任务将在这两台机器上启动。
所以数据分割和启动映射器是完全独立的两件事。第一个由HDFS
框架处理,第二个由MapReduce
框架处理。
是的,Map任务的输入是在Hadoop的Mapper阶段开始之前准备好的。映射器的数量由在Mapper阶段开始之前为给定输入文件计算的Input Splits
的数量决定。
这里的Input Split
是给定输入文件的逻辑块,默认情况下,对于文件的每个块,将准备一个input Split,对于每个输入Split,将分配一个映射任务。
您可以通过控制mapreduce.input.fileinputformat.split.maxsize
和mapreduce.input.fileinputformat.split.minsize
属性来控制inputsplit的数量。
可用于执行计算的map任务数的节点数取决于集群的容量。
例如,假设您的输入文件大小约为100GB(102400mb),块大小为100MB,输入分割大小为块大小(默认值),则会计算1024个Map任务。在这种情况下,假设集群中可用于跨集群执行map/reduce任务的最大容器是500个,那么在最好的情况下,只有500个映射器将并行执行。较早执行Map任务容器的机器将从队列中选择下一个Map任务并继续执行,直到所有映射器都完成。