Hadoop 中 Mapper 的输入赋值
Input assignment to Mapper in Hadoop
我的问题是,MapReduce 框架(例如 Hadoop 实现)是在映射器作业开始之前为映射器分配输入还是在运行时完成?
也就是说,假设我有一些输入 i
和机器 m_1,m_2 .. m_k
。机器不需要同等功率,有些机器可能比其他机器具有更好的性能(CPU,内存)。如果主节点将输入拆分到映射器直到映射器任务开始,或者至少将输入分配给特定的映射器节点,则可能存在某些机器(更强的机器)可以完成其工作并等待的情况。但是,如果拆分作业在运行时完成,则不会出现此问题。
如果你在preMapper阶段也指出MapReduce
的整体拆分机制,我会很高兴。
在 MapReduce
框架中,Mapper
任务根据 数据局部性概念 分配给机器。这意味着,存储数据块的数据节点将被分配执行该数据块的映射器任务。
当您使用为数据复制和块大小定义的配置将数据存储到 HDFS
时,会发生数据拆分(块)。因此,如果原始文件是 128MB 并且块大小是 64MB 那么文件将被分成两个块。这些块将存储在两台不同的机器上。这是来自 HDFS design 文档的引用:
A typical block size used by HDFS is 64 MB. Thus, an HDFS file is chopped up into 64 MB chunks, and if possible, each chunk will reside on a different DataNode.
现在,当 运行 特定文件的 MapReduce
作业时,将在这两台计算机上启动两个 Mapper
任务。
所以mapper的data split和launching是完全独立的两件事。第一个由 HDFS
框架处理,第二个由 MapReduce
框架处理。
是的,Map 任务的输入是在 Hadoop 中的 Mapper 阶段开始之前准备的。映射器的数量取决于在映射器阶段开始之前为给定输入文件计算的 Input Splits
的数量。
这里的 Input Split
是给定输入文件的逻辑块,默认情况下,对于文件的每个块,将准备一个 Input Split,并为每个输入 split 分配一个映射器任务。
您可以通过控制 mapreduce.input.fileinputformat.split.maxsize
和 mapreduce.input.fileinputformat.split.minsize
属性来控制 InputSplit 的数量。
可用于执行计算出的映射任务数的节点数取决于集群的容量。
例如,假设您的输入文件大小约为 100GB(102400 MB),块大小为 100MB,并且输入拆分大小为块大小(默认情况下),则将计算 1024 个 Map 任务。在这种情况下,假设集群中可用于在集群中执行 map/reduce 任务的最大容器为 500,那么在最好的情况下,只有 500 个映射器将并行执行。较早执行 Map 任务容器的机器将从队列中选择下一个 Map 任务并继续下去,直到所有映射器完成。
希望这对您有所帮助。
我的问题是,MapReduce 框架(例如 Hadoop 实现)是在映射器作业开始之前为映射器分配输入还是在运行时完成?
也就是说,假设我有一些输入 i
和机器 m_1,m_2 .. m_k
。机器不需要同等功率,有些机器可能比其他机器具有更好的性能(CPU,内存)。如果主节点将输入拆分到映射器直到映射器任务开始,或者至少将输入分配给特定的映射器节点,则可能存在某些机器(更强的机器)可以完成其工作并等待的情况。但是,如果拆分作业在运行时完成,则不会出现此问题。
如果你在preMapper阶段也指出MapReduce
的整体拆分机制,我会很高兴。
在 MapReduce
框架中,Mapper
任务根据 数据局部性概念 分配给机器。这意味着,存储数据块的数据节点将被分配执行该数据块的映射器任务。
当您使用为数据复制和块大小定义的配置将数据存储到 HDFS
时,会发生数据拆分(块)。因此,如果原始文件是 128MB 并且块大小是 64MB 那么文件将被分成两个块。这些块将存储在两台不同的机器上。这是来自 HDFS design 文档的引用:
A typical block size used by HDFS is 64 MB. Thus, an HDFS file is chopped up into 64 MB chunks, and if possible, each chunk will reside on a different DataNode.
现在,当 运行 特定文件的 MapReduce
作业时,将在这两台计算机上启动两个 Mapper
任务。
所以mapper的data split和launching是完全独立的两件事。第一个由 HDFS
框架处理,第二个由 MapReduce
框架处理。
是的,Map 任务的输入是在 Hadoop 中的 Mapper 阶段开始之前准备的。映射器的数量取决于在映射器阶段开始之前为给定输入文件计算的 Input Splits
的数量。
这里的 Input Split
是给定输入文件的逻辑块,默认情况下,对于文件的每个块,将准备一个 Input Split,并为每个输入 split 分配一个映射器任务。
您可以通过控制 mapreduce.input.fileinputformat.split.maxsize
和 mapreduce.input.fileinputformat.split.minsize
属性来控制 InputSplit 的数量。
可用于执行计算出的映射任务数的节点数取决于集群的容量。
例如,假设您的输入文件大小约为 100GB(102400 MB),块大小为 100MB,并且输入拆分大小为块大小(默认情况下),则将计算 1024 个 Map 任务。在这种情况下,假设集群中可用于在集群中执行 map/reduce 任务的最大容器为 500,那么在最好的情况下,只有 500 个映射器将并行执行。较早执行 Map 任务容器的机器将从队列中选择下一个 Map 任务并继续下去,直到所有映射器完成。
希望这对您有所帮助。