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

时间:2012-05-23 11:41:42

标签: hadoop

我对hadoop

有所了解

我很想知道它是如何运作的。

准确地说,我想知道它是如何划分/拆分输入文件的。

它在大小方面是否按相同的块划分?

或者它是可配置的东西。

我确实经历了这个post,但我无法理解

2 个答案:

答案 0 :(得分:1)

这取决于InputFormat,对于大多数基于文件的格式,它在FileInputFormat基类中定义。

有许多可配置的选项可以表示hadoop如何处理单个文件并将其作为单个拆分处理,或者将文件划分为多个拆分:

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

如果您想了解更多内容,并且能够轻松查看来源,请查看getSplits()中的FileInputFormat方法(新旧API都采用相同的方法,但它们可能有一些suttle差异)。

答案 1 :(得分:0)

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

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

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));

您可以查看示例here