为什么我们需要知道mapreduce中正在处理的文件的名称?

时间:2016-06-28 22:49:58

标签: hadoop mapreduce

我遇到了一篇帖子,询问如何通过mapreduce处理文件名。这让我想知道在什么情况下我们需要知道正在处理的文件的名称或路径。

FileSplit fileSplit = (FileSplit) context.getInputSplit();

String fileName = fileSplit.getPath().getName();

由于 basam

2 个答案:

答案 0 :(得分:1)

有几种情况,例如文件的名称很重要:

  1. 此过程中需要文件名中的时间戳。
  2. 根据文件名,您可以处理不同的文件。就像你有两个非常相似的文件类型,需要类似的过程,差异很小(如果没有,可能最好有两个不同的mapreduce工作)。
  3. 除了要处理的进程外,还要跟踪处理的文件的名称。

答案 1 :(得分:0)

有趣的问题。

假设你需要根据mapper id高效生成唯一的整数,就像在这里完成一样:Unique Key generation in Hive/Hadoop

或者你可能有完全不同的理由使用mapper id(由context.getTaskAttemptID()返回.getTaskID()。getId())

映射器任务ID的问题在于它未根据输入文件确定性地分配。

例如,您的映射器输入文件可能是前一个reducer的结果,并且说您有10个输入分区:

输出-R-00000 输出-R-00001 ... 输出-R-00009

现在您需要将此数据提供给映射器,并且可能需要此映射器具有直接对应于输入文件索引的ID。

通常,在这种情况下,您首先要做的是禁用输入拆分,这样每个映射器都会完全处理自己的分区。

但是正如我之前所说的那样,映射器没有确定性分配,所以你不能依赖context.getTaskAttemptID()。getTaskID()。getId():

有时映射器0将处理输出-r-00000,有时输出-r-00001,依此类推。

因此,为了确定性地提出自定义映射器ID,您可以使用输入文件名来解析分区索引。