我认为您在这里混淆了两件事,以下两种拆分类型是完全分开的:
- 将文件拆分为 HDFS 块
- 拆分要分发给映射器的文件
而且,不,拆分位置不是以数据感知方式计算的。
现在,默认情况下,如果您使用FileInputFormat
,那么这两种类型的拆分类型的重叠(因此是相同的)。
但是对于上面的第二点,您总是可以有一种自定义的拆分方式(甚至根本没有拆分,即让一个完整的文件转到单个映射器)。
您还可以更改 hdfs 块大小,而与InputFormat
拆分输入数据的方式无关。
这里要注意的另一个重点是,虽然文件在存储到 HDFS 时实际上是物理损坏的,但是为了分发给映射器的拆分,没有文件的实际物理拆分,而只是逻辑拆分。
以这里为例:
假设我们要加载一个 110MB 的文本文件到 hdfs。hdfs 块大小和输入拆分大小设置为 64MB。
映射器的数量基于输入拆分的数量而不是 hdfs 块拆分的数量。
当我们将 hdfs 块设置为 64MB 时,它正好是 67108864(64*1024*1024) 字节。我的意思是文件将从行的中间分割并不重要。
现在我们有 2 个输入拆分(所以有两个映射)。第一个块的最后一行和第二个块的第一行没有意义。TextInputFormat 负责读取有意义的行并将它们提供给映射作业。TextInputFormat 的作用是:
- 在第二个块中,它将寻找完整的第二行并从那里读取并将其提供给第二个映射器。
- 第一个映射器将读取直到第一个块的结尾,并且它还将处理(第一个块的最后一个不完整的行+第二个块的第一个不完整的行)。
在这里阅读更多。