java在hadoop中为mapper分配输入

e0bqpujr  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(314)

我的问题是,mapreduce框架(例如hadoop实现)是在mapper作业开始之前为mapper分配输入,还是在运行时分配输入?
也就是说,假设我有一些意见 i ,和机器 m_1,m_2 .. m_k . 这些机器不需要相同的功率,有些可能比另一些有更好的性能(cpu,内存)。如果主节点将输入拆分到Map器,直到Map器任务开始,或者至少将输入分配给特定的Map器节点,则可能存在某些机器(更强的机器)可以完成其工作并等待的情况。但是,如果分割作业是在运行时完成的,则不会出现此问题。
如果您还指出 MapReduce 在前期阶段,我会很高兴。

41zrol4v

41zrol4v1#

MapReduce 框架 Mapper 任务根据数据局部性概念分配给机器。这意味着,存储数据块的数据节点将被分配执行该数据块的Map器任务。
当您将数据存储到 HDFS 使用为数据复制和块大小定义的配置。因此,如果原始文件是128mb,块大小是64mb,那么文件将被分成两个块。这些积木将存放在两台不同的机器上。以下是hdfs设计文件的引用:
hdfs使用的典型块大小是64 mb。因此,一个hdfs文件被分割成64mb的块,如果可能的话,每个块将驻留在不同的datanode上。
现在什么时候开始 MapReduce 一个特定文件的作业然后两个 Mapper 任务将在这两台机器上启动。
因此,数据分割和Map绘制程序的启动完全是两件独立的事情。第一个是由 HDFS 第二是框架 MapReduce 框架。

ekqde3dh

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程序。
希望这有帮助。

相关问题