覆写HDFS文件/目录

问题描述:

问题覆写HDFS文件/目录

我保存在HDFS文件和所有我想要做的就是运行我的火花的应用程序,计算结果javaRDD,为了存储新的使用saveAsTextFile() HDFS中的“文件”。

但是,如果文件已存在,Spark的saveAsTextFile()不起作用。它不覆盖它。

我试过

所以我寻找一个解决方案,这一点,我发现一个可行的办法,使其试图保存新的一个工作之前可以通过HDFS API来删除文件。

我添加的代码:

FileSystem hdfs = FileSystem.get(new Configuration()); 
Path newFolderPath = new Path("hdfs://node1:50050/hdfs/" +filename); 

if(hdfs.exists(newFolderPath)){ 
    System.out.println("EXISTS"); 
    hdfs.delete(newFolderPath, true); 
} 

filerdd.saveAsTextFile("/hdfs/" + filename); 

当我试图运行我的星火应用程序,该文件已被删除,但我得到一个FileNotFoundException

考虑到这样的事实,即当有人试图从路径中读取文件并且文件不存在时发生此异常,这是没有意义的,因为在删除文件之后,没有代码尝试读取它。我的代码

JavaRDD<String> filerdd = sc.textFile("/hdfs/" + filename) // load the file here 
... 
... 
// Transformations here 
filerdd = filerdd.map(....); 
... 
... 

// Delete old file here 
FileSystem hdfs = FileSystem.get(new Configuration()); 
Path newFolderPath = new Path("hdfs://node1:50050/hdfs/" +filename); 

if(hdfs.exists(newFolderPath)){ 
    System.out.println("EXISTS"); 
    hdfs.delete(newFolderPath, true); 
} 

// Write new file here 
filerdd.saveAsTextFile("/hdfs/" + filename); 

部分,我想在这里做最简单的事情,但我不知道为什么这是行不通的。也许filerdd以某种方式连接到路径?

+0

你可以添加堆栈跟踪吗? – javadba

问题是您使用相同的路径进行输入和输出。 Spark的RDD将被延迟执行。它在您拨打saveAsTextFile时运行。此时,您已经删除了newFolderPath。所以filerdd会抱怨。

无论如何,你不应该使用相同的路径输入和输出。

+0

但是将文件保存在HDFS中的另一个路径中对我来说不起作用,因为我多次执行了我的Spark应用程序,并且始终希望使用保存为输入的最新文件。 – pirox22

+0

只需将文件保存在临时路径中即可。运行'saveAsTextFile'后,您可以删除输入并使用输入路径重命名临时路径。 – zsxwing