有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案