Hadoop 在MapReduce框架中如何分割输入文件?

Hadoop 在MapReduce框架中如何分割输入文件?,hadoop,mapreduce,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:

假设一个带有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

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


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

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

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

至于您的实际问题,是的,所有使用相同输入格式的作业都是相同的。原因是,创建拆分是您正在使用的InputFormat的工作。准确地说,InputFormat的getSplits(JobContext上下文)中的逻辑控制着拆分的创建。因此,如果所有的工作岗位都是相同的,那么分割创造也将是相同的

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

每个区块有两件事:

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

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

FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
现在,您可以在此文件上打开一个FSDataInputStream,并读取其内容


希望它能回答您的问题。

谢谢。如果我的Hadoop程序在每个作业中,每个数据块都与一个文件相关。例如,在第一个作业中,区块1与F1相关,区块2与F2相关,等等。因此,映射器读取区块1也必须读取F1。在下一个作业中,不同的映射程序可能会读取区块1,因此它也必须读取F1。如果块有一个唯一的名称,那么可以这样做,但正如您所提到的,它们没有唯一的名称。话虽如此,有没有办法处理这种情况?是的。将读取这些文件。这里需要什么?需要特定块所属的文件名吗?每个块都有一个必须由映射程序读取的相关文件。e、 例如,区块1与F1相关,区块2中与F2相关。因此,由块1提供的映射器必须读取F1,由块2提供的映射器必须读取F2。我明白了。你的问题是什么?如果块没有指定唯一的名称,我怎么做我想做的?也就是说,如何区分不同的块,然后读取相应的相关文件?