如何在MapReduce框架中完成输入文件的拆分?

时间:2013-09-17 19:47:05

标签: hadoop mapreduce

假设使用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

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

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

1 个答案:

答案 0 :(得分:1)

我的问题是,如果再次运行拆分的方式是否仍然相同?

确实首先将输入数据拆分为块,然后将这些块中的每一个送入映射器。但是,它并不总是64M。也许你已经对HDFS块(通常是64M)和MR分裂感到困惑。两者都完全不同。虽然您的分割大小和块大小是相同的。

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

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

每个块有两件事:

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

修改:

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

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

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

希望它能回答你的问题。