在Hadoop中使用过滤器对文件进行原子移动

时间:2016-06-03 09:09:40

标签: java hadoop

到目前为止,我已经使用FileUtil.copy在同一个Hadoop系统上将文件从一个目录移动(即重命名)到另一个目录。我复制后删除原始文件。有一些限制因素影响了这一决定:

  • 必须在应用程序内部完成,因此没有hdfs dfs命令或其他shell实用程序。
  • 我需要对文件列表进行过滤(有些必须排除),所以我只能使用listStatus方法(至少据我所知)。
  • 如果目标目录存在或包含文件,则这些文件应保留在那里,因此不会覆盖现有文件。

问题是FileUtil.copy不是原子的(显然),因此对于大量文件,这使得整个操作变慢。

Hadoop兼容的文件系统需要guarantee atomicity重命名,我假设包括将它们移动到另一个目录(在同一文件系统上)。我的问题是,我找到了另外两个选项,但他们不适合我的情况:

  • FileSystem.rename假设目标目录不存在(非覆盖模式)或者它是空的(覆盖模式),至少根据源代码文档,它不在Javadoc虽然。
  • FileUtils.replaceFile(我不确定它是否是原子的)需要java.io.File的实例,据我所知,如果没有先复制FileStatus实例,就无法获取<div>实例文件到本地FS,无论如何都会破坏原子性,因为我首先要复制文件,重命名,然后再移回它们。

还有其他方法我错过了吗?

0 个答案:

没有答案