Hadoop';s输入拆分-它是如何工作的

Hadoop';s输入拆分-它是如何工作的,hadoop,Hadoop,我知道关于 我很想知道它是如何工作的 确切地说,我想知道它是如何分割输入文件的 它在大小上是否分成相等的块 或者它是可配置的东西 我确实读过,但我不明白这取决于InputFormat,对于大多数基于文件的格式,InputFormat是在FileInputFormat基类中定义的 有许多可配置选项表示hadoop将如何获取单个文件并将其作为单个拆分进行处理,或将文件拆分为多个拆分: 如果输入文件被压缩,则输入格式和压缩方法必须是可拆分的。例如,Gzip是不可拆分的(您不能随机查找文件中的某个点并

我知道关于

我很想知道它是如何工作的

确切地说,我想知道它是如何分割输入文件的

它在大小上是否分成相等的块

或者它是可配置的东西


我确实读过,但我不明白这取决于InputFormat,对于大多数基于文件的格式,InputFormat是在
FileInputFormat
基类中定义的

有许多可配置选项表示hadoop将如何获取单个文件并将其作为单个拆分进行处理,或将文件拆分为多个拆分:

  • 如果输入文件被压缩,则输入格式和压缩方法必须是可拆分的。例如,Gzip是不可拆分的(您不能随机查找文件中的某个点并恢复压缩流)。BZip2是可拆分的。有关详细信息,请参阅输入格式的特定
    InputFormat.isSplittable()
    实现
  • 如果文件大小小于或等于其定义的HDFS块大小,则hadoop很可能会在单个拆分中处理它(可以配置此项,请参阅后面关于拆分大小属性的一点)
  • 如果文件大小大于其定义的HDFS块大小,则hadoop很可能会根据底层块将文件分成多个部分(4个块将导致4个部分)
  • 您可以配置两个属性
    mapred.min.split.size
    mapred.max.split.size
    ,这两个属性在将块拆分为多个拆分时有助于输入格式。请注意,输入格式(可能具有固定的最小输入大小)可能会覆盖最小大小

如果您想了解更多信息,并且能够轻松地查看源代码,请查看
FileInputFormat
中的
getSplits()
方法(新api和旧api都有相同的方法,但它们可能有一些细微差别)。

当您提交map reduce作业(或pig/hive作业)时,Hadoop首先计算输入拆分,每个输入分割大小通常等于HDFS块大小。例如,对于1GB大小的文件,如果块大小为64MB,则将有16个输入拆分。但是,分割大小可以配置为小于/大于HDFS块大小。使用FileInputFormat完成输入拆分的计算。对于每个输入拆分,都必须启动映射任务

但您可以通过配置以下属性来更改输入拆分的大小:

mapred.min.split.size: The minimum size chunk that map input should be split into.
mapred.max.split.size: The largest valid size inbytes for a file split. 
dfs.block.size: The default block size for new files.
输入拆分的公式为:

Math.max("mapred.min.split.size", Math.min("mapred.max.split.size", blockSize));
您可以查看示例