inq*_*ire 7 java hadoop mapreduce cluster-computing cloudera
我试图找出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.
}
Run Code Online (Sandbox Code Playgroud)
我有兴趣找出context.write()最终写入数据的位置.到目前为止我遇到了:
FileOutputFormat.getWorkOutputPath(context);
Run Code Online (Sandbox Code Playgroud)
这给了我在hdfs上的以下位置:
hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0
Run Code Online (Sandbox Code Playgroud)
当我尝试将它用作另一个作业的输入时,它会给我以下错误:
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
Run Code Online (Sandbox Code Playgroud)
注意:作业是在Mapper中启动的,因此从技术上讲,Mapper任务写入的临时文件夹的输出在新作业开始时存在.然后,它仍然说输入路径不存在.
有关临时输出写入的想法吗?或者也许在同时具有Map和Reduce阶段的作业中我可以找到Map任务输出的位置是什么?
所以,我已经弄清楚到底发生了什么。
映射器的输出被缓冲,直到它达到其大小的 80% 左右,然后它开始将结果转储到其本地磁盘并继续允许项目进入缓冲区。
我想获得映射器的中间输出并将其用作另一个作业的输入,而映射器仍在运行。事实证明,如果不大量修改 hadoop 0.20.204 部署,这是不可能的。系统的工作方式甚至是在地图上下文中指定的所有内容之后:
map .... {
setup(context)
.
.
cleanup(context)
}
Run Code Online (Sandbox Code Playgroud)
并且调用了清理,仍然没有转储到临时文件夹。
之后,整个 Map 计算最终会合并并转储到磁盘,并成为 Reducer 之前的 Shuffling 和 Sorting 阶段的输入。
到目前为止,我所阅读和查看的所有内容都应该是输出最终所在的临时文件夹,这是我事先猜测的。
FileOutputFormat.getWorkOutputPath(context)
Run Code Online (Sandbox Code Playgroud)
我设法以不同的方式完成了我想做的事情。无论如何,对此可能有任何疑问,请告诉我。
| 归档时间: |
|
| 查看次数: |
15388 次 |
| 最近记录: |