0

假设一个带有 m 个映射器的 map-reduce 作业,它由输入文件 F 提供。显然,mapreduce 框架将 F 分成块(默认值为 64 MB)并将每个块提供给一个映射器。我的问题是,如果我多次运行这个 mapreduce 作业,所有这些块的形成方式是否相同?也就是说,mapreduce 框架拆分 F 的点保持不变还是可能不同?

例如,假设 F 包含以下行:

1,2

3,5

5,6

7,6

5,5

7,7

在第一次运行中,mapreduce 形成两个块,如下所示:

块 1:

1,2

3,5

5,6

块 2:

7,6

5,5

7,7

我的问题是,如果我再次运行,拆分的方式是否保持不变?

此外,每个块是否有一个可以在映射器中使用的唯一名称?

4

1 回答 1

1

我的问题是,如果我再次运行,拆分的方式是否保持不变?

确实,输入数据首先被分成块,然后每个块都被馈送到映射器。但是,它并不总是 64M。也许您对 HDFS 块(通常为 64M)和 MR 拆分感到困惑。两者是完全不同的东西。尽管您的分割大小和块大小可能相同。

谈到你的实际问题,是的,所有使用相同 InputFormat 的工作都是一样的。原因是,您正在使用 InputFormat 来创建拆分。准确地说,您的 InputFormat 的getSplits(JobContext context)内部的逻辑控制着拆分的创建。因此,如果所有工作都相同,则拆分创建也将相同。

此外,每个块是否有一个可以在映射器中使用的唯一名称?

每个块有两件事:

  • 以字节为单位的长度。
  • 一组存储位置,它们只是主机名字符串。

编辑 :

如何获取映射器正在执行的文件的名称:

FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();

现在,您可以在此文件上打开FSDataInputStream并读取其内容。

希望它能回答您的查询。

于 2013-09-17T19:57:03.637 回答