7

我试图找出 Map 任务的输出在被 Reduce 任务使用之前保存到磁盘的位置。

注意: - 使用的版本是带有新 API 的 Hadoop 0.20.204

例如,在 Map 类中覆盖 map 方法时:

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        context.write(word, one);
    }

    // code that starts a new Job.

}

我很想知道 context.write() 最终在哪里写入数据。到目前为止,我遇到了:

FileOutputFormat.getWorkOutputPath(context);

这给了我在 hdfs 上的以下位置:

hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0

当我尝试将其用作另一项工作的输入时,它给了我以下错误:

org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0

注意:该作业是在 Mapper 中启动的,因此从技术上讲,当新作业开始时,Mapper 任务正在写入其输出的临时文件夹就存在。话又说回来,它仍然说输入路径不存在。

关于临时输出的写入位置有什么想法吗?或者,在同时具有 Map 和 Reduce 阶段的作业期间,我可以在哪里找到 Map 任务的输出?

4

3 回答 3

6

Map reduce 框架会将中间输出存储到本地磁盘而不是 HDFS,因为这会导致不必要的文件复制。

于 2013-08-05T04:31:44.213 回答
5

所以,我已经弄清楚到底发生了什么。

映射器的输出被缓冲直到它达到其大小的 80% 左右,此时它开始将结果转储到其本地磁盘并继续允许项目进入缓冲区。

我想获得映射器的中间输出并将其用作另一个作业的输入,而映射器仍在运行。事实证明,如果不大量修改 hadoop 0.20.204 部署,这是不可能的。即使在地图上下文中指定了所有内容之后,系统的工作方式也是如此:

map .... {
  setup(context)
  .
  .
  cleanup(context)
}

并调用了清理,仍然没有转储到临时文件夹。

之后,整个 Map 计算最终都被合并并转储到磁盘,并成为 Reducer 之前的 Shuffle 和 Sorting 阶段的输入。

到目前为止,从我所阅读和查看的所有内容来看,最终应该输出的临时文件夹是我事先猜测的那个。

FileOutputFormat.getWorkOutputPath(context)

我设法以不同的方式完成了我想做的事情。无论如何,可能有任何关于此的问题,请告诉我。

于 2011-12-27T15:04:38.667 回答
2

任务跟踪器为每个 Map 或 Reduce 任务启动一个单独的 JVM 进程。

映射器输出(中间数据)被写入每个映射器从节点的本地文件系统(不是 HDFS)。一旦数据传输到 Reducer,我们将无法访问这些临时文件。

如果您要查看 Mapper 输出,我建议使用IdentityReducer?

于 2011-12-23T15:24:04.457 回答