我的问题是,mapreduce框架(例如hadoop实现)是在mapper作业开始之前为mapper分配输入,还是在运行时分配输入?
也就是说,假设我有一些意见 i
,和机器 m_1,m_2 .. m_k
. 这些机器不需要相同的功率,有些可能比另一些有更好的性能(cpu,内存)。如果主节点将输入拆分到Map器,直到Map器任务开始,或者至少将输入分配给特定的Map器节点,则可能存在某些机器(更强的机器)可以完成其工作并等待的情况。但是,如果分割作业是在运行时完成的,则不会出现此问题。
如果您还指出 MapReduce
在前期阶段,我会很高兴。
2条答案
按热度按时间41zrol4v1#
在
MapReduce
框架Mapper
任务根据数据局部性概念分配给机器。这意味着,存储数据块的数据节点将被分配执行该数据块的Map器任务。当您将数据存储到
HDFS
使用为数据复制和块大小定义的配置。因此,如果原始文件是128mb,块大小是64mb,那么文件将被分成两个块。这些积木将存放在两台不同的机器上。以下是hdfs设计文件的引用:hdfs使用的典型块大小是64 mb。因此,一个hdfs文件被分割成64mb的块,如果可能的话,每个块将驻留在不同的datanode上。
现在什么时候开始
MapReduce
一个特定文件的作业然后两个Mapper
任务将在这两台机器上启动。因此,数据分割和Map绘制程序的启动完全是两件独立的事情。第一个是由
HDFS
第二是框架MapReduce
框架。ekqde3dh2#
是的,Map任务的输入是在hadoop中mapper阶段开始之前准备好的。Map绘制者的数量由Map绘制者的数量决定
Input Splits
在Map程序阶段开始之前为给定的输入文件计算。在这里
Input Split
是给定输入文件的逻辑块,其中默认情况下,将为文件的每个块准备一个输入拆分,并为每个输入拆分分派一个Map器任务。您可以通过控制
mapreduce.input.fileinputformat.split.maxsize
以及mapreduce.input.fileinputformat.split.minsize
属性。可用于执行计算出的Map任务数的节点数取决于集群的容量。
例如,假设输入文件的大小约为100gb(102400MB),块大小为100mb,并且输入拆分大小为块大小(默认情况下),则将计算1024个Map任务。在这种情况下,假设集群中可用于跨集群执行map/reduce任务的最大容器数为500,那么在最佳情况下,只能并行执行500个Map器。较早执行Map任务容器的机器将从队列中选取下一个Map任务,并继续执行,直到完成所有Map程序。
希望这有帮助。