我的问题是,MapReduce框架(例如Hadoop实现)是否在映射器作业启动之前为映射器分配输入,或者在运行时完成?
也就是说,假设我有一些输入i
和机器m_1,m_2 .. m_k
。机器不需要同等供电,有些可能比其他机器具有更好的性能(CPU,内存)。如果主节点将输入分割为映射器直到映射器任务开始,或者至少将输入分配给特定的映射器节点,则可能存在某些机器(较强的机器)可以完成其工作并等待的情况。但是,如果在运行时完成拆分作业,则不会出现此问题。
如果您还在preMapper阶段指出MapReduce
的整体拆分机制,我会很高兴。
答案 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.maxsize
和mapreduce.input.fileinputformat.split.minsize
属性来控制InputSplits的数量。
可用于执行计算的映射任务数的节点数取决于群集的容量。
例如,假设您的输入文件大小约为100GB(102400 MB),块大小为100MB,输入拆分大小为块大小(默认情况下),则将计算1024个Map任务。在这种情况下,假设您在集群中执行map / reduce任务的集群的最大容器数为500,那么在最好的情况下,并行执行只有500个映射程序。无论哪个执行Map任务容器的机器都会更快地从队列中选择下一个Map任务并继续,直到所有映射器都完成。
希望这会有所帮助。