2014-10-30 72 views
0

删除中间输出文件中尝试使用我如何从HDFS

FileUtils.deleteDirectory(new File(tempFiles)); 

删除的MapReduce程序的中间输出目录,但该命令没有从HDFS删除目录。

回答

0

映射reduce不会在hdfs上编写中间结果,而是写入本地磁盘。

每当映射器产生输出时,它首先进入内存缓冲区,当缓冲区超过其默认容量时进行分区和排序时,会将这些结果泄漏到本地磁盘中。

摘要是由mapper生成的输出进入本地文件系统。

只有在一种情况下,mapper会将其输出写入hdfs,如果明确地说它已经在驱动程序类中设置为不使用任何reducer。

在上面的情况下会有最终的输出,我们不会说它的中间。

+0

你应该得到-1。 – blackSmith 2014-10-30 05:12:40

+0

为什么我错了? – user3484461 2014-10-30 05:16:17

+0

我收回我的第一条评论,对不起。尽管你的解释是正确的,但是如果他提供了中间文件的正确路径(当地文件),他的当前代码应该工作。无论如何,想一次,谁想要手动删除MR作业的中间文件,当清理是默认自动。看看http://stackoverflow.com/questions/7867608/hadoop-mapreduce-intermediate-output – blackSmith 2014-10-30 05:35:12

0

您正在使用错误的API男孩!你应该使用apache FileUtil而不是FileUtils。后者用于本地文件系统中的文件操作。

https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/fs/FileUtil.html#fullyDelete http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html

我明白,人们可以很容易选错了一个,由于相似的名称。您当前的代码正在查看本地文件系统以删除该路径,而不会对HDFS产生任何影响。

示例代码:

FileUtil.fullyDelete(new File("pathToDir")); 

在另一方面,你可以利用FileSystem API本身具有方法delete的。尽管你需要获得FileSystem对象。例如:

filesystem.delete(new Path("pathToDir"), true); 

第二个参数是递归标志。