在Hadoop中,框架将Map任务的输出保存在一个普通的Map- reduce应用程序中



我想知道Map任务的输出在哪里被保存到磁盘,然后才能被Reduce任务使用。

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

例如,当覆盖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任务的输出的位置是什么?

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

我知道到底是怎么回事了。

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

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

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

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

之后,整个Map计算的所有内容最终被合并并转储到磁盘,并成为在Reducer之前的改组和排序阶段的输入。

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

FileOutputFormat.getWorkOutputPath(context)
我设法用另一种方法完成了我想做的事。无论如何如果有任何问题,请告诉我。

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

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

如果你想看到你的Mapper输出,我建议使用IdentityReducer ?

相关内容

最新更新