Hadoop中带过滤器的java原子文件移动
到目前为止,我已经在同一个Hadoop系统上使用FileUtil.copy
将文件从一个目录移动(即重命名)到另一个目录。复制后,我将删除原始文件。有几个限制因素影响了这个决定:
- 它必须在应用程序内部完成,因此没有
hdfs dfs
命令或其他shell实用程序李> - 我需要在文件列表上设置一个过滤器(必须排除某些文件),因此我只能使用
listStatus
方法(至少据我所知)李> - 如果目标目录存在或包含文件,则这些文件应保留在那里,因此不会覆盖现有文件李>
问题是FileUtil.copy
不是原子的(显然),因此对于大量文件,这会使整个操作变慢
Hadoop兼容的文件系统需要进行guarantee atomicity次重命名,我假设这包括将它们移动到另一个目录(在同一文件系统上)。我的问题是,我找到了另外两种选择,但它们在我的情况下不起作用:
FileSystem.rename
假设目标目录不存在(非覆盖模式)或者是空的(覆盖模式),至少根据源代码文档是这样的,但Javadoc中没有李>FileUtils.replaceFile
(我甚至不确定它是否是原子的)需要java.io.File
的实例,据我所知,如果不先将文件复制到本地FS,就无法从FileStatus
实例中获取这些实例,这几乎破坏了原子性,因为我首先必须复制文件,重命名,然后将它们移回李>
还有其他我错过的方法吗
共 (0) 个答案