hadoop 中每个映射器的单个或多个文件?

Single or multiple files per mapper in hadoop?

映射器是同时处理多个文件还是映射器一次只能处理一个文件?我想知道默认行为

如果您查看 FileInputFormat 的定义,您会看到它在顶部有三个方法:

addInputPath(JobConf conf, Path path) - 添加路径到 map-reduce 作业的输入列表。因此它将拾取目录中的所有文件,而不是单个文件,如您所说

addInputPathRecursively(List result, FileSystem fs, Path path, PathFilter inputFilter) - 将输入路径中的文件递归添加到结果中。

addInputPaths(JobConf conf, String commaSeparatedPaths) - 将给定的逗号分隔路径添加到 map-reduce 作业的输入列表中

操作这三种方法,您可以轻松设置您想要的任何多路输入。然后 InputSplits 的 InputFormat 开始在映射器作业之间拆分此数据。 Map-Reduce 框架依赖作业的 InputFormat 来:

  • 验证作业的输入规范。

  • 将输入文件拆分为逻辑 InputSplits,然后将每个分配给一个单独的 Mapper。

  • 提供 RecordReader 实现,用于从逻辑 InputSplit 收集输入记录以供 Mapper 处理。

所以从技术上讲,单个映射器将只处理它自己的部分,它可以包含来自多个文件的数据。但是对于每种特定格式,您应该查看 InputSplit 以了解数据将如何在映射器之间分布。

  • 默认情况下,典型的 Mapreduce 作业遵循每个映射器的一个输入拆分。
  • 如果文件大小大于拆分大小(即,它有更多 比一个输入拆分),那么每个文件有多个映射器。
  • 如果文件不像 Gzip 那样可拆分,则每个映射器一个文件 文件,或者如果进程是 Distcp,其中文件是最精细的粒度级别。