Java Hadoop中映射器的输入赋值

Java Hadoop中映射器的输入赋值,java,hadoop,mapreduce,mapper,Java,Hadoop,Mapreduce,Mapper,我的问题是,MapReduce框架(例如Hadoop实现)是在mapper作业开始之前为mapper分配输入,还是在运行时完成 也就是说,假设我有一些输入I,机器m1,m2。。m_k。这些机器不需要同样的功率,有些可能比另一些有更好的性能(CPU、内存)。如果主节点将输入拆分为映射器,直到映射器任务开始,或者至少将输入分配给特定的映射器节点,则可能存在某些机器(更强的机器)可以完成其工作并等待的情况。但是,如果在运行时完成拆分作业,则不会出现此问题 如果您也在preMapper阶段指出MapRe

我的问题是,MapReduce框架(例如Hadoop实现)是在mapper作业开始之前为mapper分配输入,还是在运行时完成

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


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

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

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

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

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


因此,数据分割和地图绘制程序的启动完全是两件独立的事情。第一个由
HDFS
框架处理,第二个由
MapReduce
框架处理。

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

此处,
输入分割
是给定输入文件的逻辑块,默认情况下,对于文件的每个块,将准备一个输入分割,对于每个输入分割,将调度一个映射器任务

通过控制
mapreduce.input.fileinputformat.split.maxsize
mapreduce.input.fileinputformat.split.minsize
属性,可以控制InputSplit的数量

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

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


希望这有帮助。

谢谢您的回答。所以,从你所说的,有一种可能性,如果我有5个映射器,并且数据存储在2台机器内的HDFS上(按照你给出的配置),那么剩下的3个映射器将什么也不做?@JeyhunKarimov它们将只在这些机器上启动。可能是按顺序排列的。这将取决于配置,一台机器一次允许运行多少个映射器或还原器作业。我不关心那些有本地数据并成功启动映射器的机器。根据您的回答,我担心其他没有本地数据的机器无法启动mapper。我们能做些什么来克服这个问题?@JeyhunKarimov它不会在其他机器上启动这个任务。在hadoop中,数据传输不是为了这个目的。最初,当您存储数据时,HDFS会将数据分散到足够多的机器中,MapReduce可以实现良好的并行性。感谢您的解释。感谢您的回答。因此,机器执行队列中的任务,当机器中的本地数据完成处理时,队列为空。所以在那之后,机器什么也不做,等待。如果我错了,请纠正我。如果任务容器已完成执行给定任务,它们将释放插槽,并将向作业跟踪器报告它们是否可以执行新任务,在那里它们将被分配执行任何其他作业的映射任务或运行先前执行作业的缩减器。。