使用Java API在Hadoop中移动文件?

2022-09-03 00:34:57

我想使用Java API在HDFS中移动文件。我想不出一种方法来做到这一点。FileSystem 类似乎只想允许在本地文件系统之间来回移动。但我想将它们保留在HDFS中并将它们移动到那里。

我错过了一些基本的东西吗?我能想到的唯一方法是从输入流中读取它并将其写回...,然后删除旧副本(哎呀)。

谢谢


答案 1

使用 FileSystem.rename()

public abstract boolean rename(Path src, Path dst) throws IOException

将路径重命名为 路径 。可以在本地 fs 或远程 DFS 上进行。srcdst

参数:
- 要重命名的
路径 - 重命名
后的新路径 返回:
如果重命名成功
则抛出:
IOException - 失败时srcdsttrue


答案 2

java.nio.* 方法可能并不总是适用于 HDFS。因此,找到了以下有效的解决方案。

使用 org.apache.hadoop.fs.FileUtil.copy API 将文件从一个目录移动到另一个目录

val fs = FileSystem.get(new Configuration())
        val conf = new org.apache.hadoop.conf.Configuration()
        val srcFs = FileSystem.get(new org.apache.hadoop.conf.Configuration())
        val dstFs = FileSystem.get(new org.apache.hadoop.conf.Configuration())
        val dstPath = new org.apache.hadoop.fs.Path(DEST_FILE_DIR)

        for (file <- fileList) {
          // The 5th parameter indicates whether source should be deleted or not
          FileUtil.copy(srcFs, file, dstFs, dstPath, true, conf)

推荐