在Hadoop中,框架在正常的Map-Reduce应用程序中保存Map任务的输出?

我试图找出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任务输出的位置是什么?

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

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

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

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

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

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

之后,整个Map计算的所有内容最终都会合并并转储到磁盘上,并成为Reducer之前的Shuffling和Sorting阶段的输入。

到目前为止,我已经阅读并查看过,最终输出的临时文件夹是我之前猜测的那个。

 FileOutputFormat.getWorkOutputPath(context) 

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

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

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

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