0

我了解hadoop

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

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

它在大小方面是否分成相等的块?

或者它是可配置的东西。

我确实看过这篇文章,但我无法理解

4

2 回答 2

1

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

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

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

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

于 2012-05-23T13:10:10.580 回答
0

当您提交 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));

您可以在此处查看示例。

于 2015-02-13T19:46:27.000 回答