到目前为止,我已经使用FileUtil.copy
在同一个Hadoop系统上将文件从一个目录移动(即重命名)到另一个目录。我复制后删除原始文件。有一些限制因素影响了这一决定:
hdfs dfs
命令或其他shell实用程序。listStatus
方法(至少据我所知)。问题是FileUtil.copy
不是原子的(显然),因此对于大量文件,这使得整个操作变慢。
Hadoop兼容的文件系统需要guarantee atomicity重命名,我假设包括将它们移动到另一个目录(在同一文件系统上)。我的问题是,我找到了另外两个选项,但他们不适合我的情况:
FileSystem.rename
假设目标目录不存在(非覆盖模式)或者它是空的(覆盖模式),至少根据源代码文档,它不在Javadoc虽然。FileUtils.replaceFile
(我不确定它是否是原子的)需要java.io.File
的实例,据我所知,如果没有先复制FileStatus
实例,就无法获取<div>
实例文件到本地FS,无论如何都会破坏原子性,因为我首先要复制文件,重命名,然后再移回它们。还有其他方法我错过了吗?