Java 在Hadoop中,框架在普通的MapReduce应用程序中将Map任务的输出保存在哪里?

Java 在Hadoop中,框架在普通的MapReduce应用程序中将Map任务的输出保存在哪里?,java,hadoop,mapreduce,cluster-computing,cloudera,Java,Hadoop,Mapreduce,Cluster Computing,Cloudera,我试图找出映射任务的输出在哪里保存到磁盘,然后才能被Reduce任务使用 注意:-使用的版本是带有新API的Hadoop 0.20.204 例如,当覆盖map类中的map方法时: public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenize

我试图找出映射任务的输出在哪里保存到磁盘,然后才能被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
注意:作业是在映射器中启动的,因此从技术上讲,映射器任务写入其输出的临时文件夹在新作业开始时存在。然后,它仍然表示输入路径不存在


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

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

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


如果您想查看映射器输出的内容,我建议使用
IdentityReducer

这样,我就了解了真正的情况

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

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

map .... {
  setup(context)
  .
  .
  cleanup(context)
}
当调用清理时,仍然没有转储到临时文件夹

之后,整个Map计算最终合并并转储到磁盘,并成为Reducer之前的洗牌和排序阶段的输入

到目前为止,我所读到的和看到的不同之处在于,最终应该在其中输出的临时文件夹是我之前猜测的那个

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

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

顺便说一句,看起来FileOutputhFormat#getWorkOutputPath根据api文档给出了作业的临时输出文件夹的位置,而不是映射任务的位置<代码>当我尝试将其用作另一个作业的输入时,会出现以下错误:-通常在作业完成后删除临时文件,否则节点将很容易满。好的,公平点,但我在另一个作业执行时启动作业。我正在做嵌套映射还原。因此,当内部作业正在执行时,外部作业正在忙着等待,因此不应该删除任何临时文件。但是,好吧,公平地说,删除了一些东西,这意味着它们在被删除之前就在某个地方。我需要找出那在哪里依赖临时文件不是一个好的做法,因为它们可以在不同版本之间更改,而无需更改API。我同意你的看法,但我需要输出,我不知道如何获得它。有什么想法吗?