0

如果我使用 hadoop fs -put 文件名将大小为 117MB 的文本文件上传到 HDFS,我可以看到一个数据节点包含大小为 64.98MB(默认文件拆分大小)的文件部分,另一个数据节点包含大小为 48.59MB 的文件部分。

我的问题是这个分割位置是否是以数据感知的方式计算的(例如,以某种方式识别文件是文本并因此在“\n”处分割文件)。

我意识到 InputFileFormat 可用于告诉正在运行的作业如何以智能方式拆分文件,但由于我没有在 fs -put 命令中指定文件类型,我想知道是否(以及如何)智能拆分将在这种情况下完成。

艾莉

4

1 回答 1

3

我认为您在这里混淆了两件事,以下两种拆分类型是完全分开的:

  1. 将文件拆分为 HDFS 块
  2. 拆分要分发给映射器的文件

而且,不,拆分位置不是以数据感知方式计算的。

现在,默认情况下,如果您使用FileInputFormat,那么这两种类型的拆分类型的重叠(因此是相同的)。

但是对于上面的第二点,您总是可以有一种自定义的拆分方式(甚至根本没有拆分,即让一个完整的文件转到单个映射器)。

您还可以更改 hdfs 块大小,而与InputFormat拆分输入数据的方式无关。

这里要注意的另一个重点是,虽然文件在存储到 HDFS 时实际上是物理损坏的,但是为了分发给映射器的拆分,没有文件的实际物理拆分,而只是逻辑拆分。

这里为例:

假设我们要加载一个 110MB 的文本文件到 hdfs。hdfs 块大小和输入拆分大小设置为 64MB。

  1. 映射器的数量基于输入拆分的数量而不是 hdfs 块拆分的数量。

  2. 当我们将 hdfs 块设置为 64MB 时,它正好是 67108864(64*1024*1024) 字节。我的意思是文件将从行的中间分割并不重要。

  3. 现在我们有 2 个输入拆分(所以有两个映射)。第一个块的最后一行和第二个块的第一行没有意义。TextInputFormat 负责读取有意义的行并将它们提供给映射作业。TextInputFormat 的作用是:

    • 在第二个块中,它将寻找完整的第二行并从那里读取并将其提供给第二个映射器。
    • 第一个映射器将读取直到第一个块的结尾,并且它还将处理(第一个块的最后一个不完整的行+第二个块的第一个不完整的行)。

在这里阅读更多。

于 2013-04-09T17:04:25.843 回答