Hadoop MapReduce中的输入拆分

时间:2020-01-09 10:34:33  来源:igfitidea点击:

当MapReduce作业开始处理存储在HDFS中的文件时,Hadoop要做的事情之一就是将输入划分为逻辑拆分,这些拆分在Hadoop中称为输入拆分。

InputSplit表示要由单个映射任务处理的数据,这意味着启动的映射器数量等于为该作业计算的输入拆分数量。例如,如果将输入数据逻辑上划分为8个输入拆分,则将启动8个映射器以并行处理这些输入拆分。

输入拆分是数据的逻辑划分

输入拆分只是数据的逻辑划分,不包含物理数据。在此逻辑分区中,输入拆分所指的是数据中的记录。当映射器处理输入拆分时,它实际上在Hadoop中的输入拆分中处理记录((键,值)对)。

在Hadoop框架中,使用InputFormat类将输入文件拆分为逻辑InputSplits。
RecordReader类将数据分为键/值对,然后将其作为输入传递给Mapper。

Hadoop框架中的InputFormat类

public abstract class InputFormat<K, V> {
  public abstract List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException;

  public abstract RecordReader<K,V> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException;
}

输入拆分Vs HDFS块

许多人在HDFS块和输入拆分之间感到困惑,因为HDFS块也是将数据划分为较小的块,然后将其存储在整个群集中。而且,最终由MapReduce作业处理的是存储在节点中的数据,然后实际上是Hadoop中输入拆分的任务。

HDFS块是数据的物理表示,实际数据与Hadoop分布式文件系统一起存储。输入拆分只是数据的逻辑表示。将数据分成块存储以存储到HDFS时,它仅将数据分成128 MB(默认块大小)的块,而无需考虑记录边界。
例如,如果每个记录为50 MB,则两个记录将适合该块,而第三条记录将不适合,第三条记录的28 MB将存储在另一个块中。如果映射器处理了一个块,则它将无法处理第三条记录,因为它无法获得完整记录。

作为数据逻辑表示的输入拆分遵循逻辑记录边界。使用块中的起始记录和字节偏移量,即使它跨越了块边界,也可以获得完整的记录。因此,即使第三条记录的一部分存储在另一个块中,处理输入拆分的映射器也将能够处理所有3条记录。