假设使用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
我的问题是,如果我再次运行它,拆分的方式是否保持不变?
此外,每个块是否都有一个可以在映射器中使用的唯一名称?
答案 0 :(得分:1)
我的问题是,如果再次运行拆分的方式是否仍然相同?
确实首先将输入数据拆分为块,然后将这些块中的每一个送入映射器。但是,它并不总是64M。也许你已经对HDFS块(通常是64M)和MR分裂感到困惑。两者都完全不同。虽然您的分割大小和块大小是相同的。
来到您的实际问题,是的,所有使用相同的InputFormat 的作业都是一样的。原因是,您正在使用的InputFormat的工作是创建拆分。确切地说,InputFormat的 getSplits(JobContext context)中的逻辑控制着分割创建。因此,如果在所有作业中相同,则拆分创建也将是相同的。
此外,每个块都有一个可以在映射器中使用的唯一名称吗?
每个块有两件事:
修改:
如何获取映射器正在执行的文件的名称:
FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
现在,您可以在此文件上打开 FSDataInputStream 并阅读其内容。
希望它能回答你的问题。