java—在hdfs上重命名文件可以在本地模式下工作,但不能在集群模式下工作

gr8qqesn  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(365)

我有一个对象负责在hdfs上打开一个文件进行写入。这个对象重命名它刚写的文件 close() 方法被调用。该机制在本地模式下运行时工作,但在群集模式下无法重命名文件。

//Constructor
public WriteStream() {
    path = String.format("in_progress/file");
    try {
        OutputStream outputStream = fileSystem.create(new Path(hdfs_path+path), new Progressable() {public void progress() { System.out.print("."); }
            });
        writer = new BufferedWriter(new OutputStreamWriter(outputStream));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void close() {
    String newPath = String.format("%s_dir/%s_file", date, timestamp);
    try {
        fileSystem.rename(new Path(hdfs_path+path), new Path(hdfs_path+newPath));
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

你以前经历过吗?

7dl7o3gd

7dl7o3gd1#

显然地 FileSystem.rename(Path) 在本地模式下执行时会在路径上创建丢失的目录,但在群集模式下运行时不会。此代码在两种模式下都起作用:

public void close() {
    String dirPath = String.format("%s_dir/", date, timestamp);
    String newPath = String.format("%s_dir/%s_file", date, timestamp);
    try {
        fileSystem.mkdir(new Path(hdfs_path+dirPath));
        fileSystem.rename(new Path(hdfs_path+path), new Path(hdfs_path+newPath));
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
wvyml7n5

wvyml7n52#

只是好奇,但你怎么能重命名一个正式不存在的文件(因为你还在写)?
修复方法是在文件完成后重命名。也就是说,当您调用close方法时。
所以你的代码应该是这样的:

public void close() {
    String newPath = String.format("%s_dir/%s_file", date, timestamp);
    try {
        writer.close();
        fileSystem.rename(new Path(hdfs_path+path), new Path(hdfs_path+newPath));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

相关问题