在HDFS上重命名文件在本地模式下工作,但不在群集模式下工作

时间:2013-06-27 08:43:23

标签: java hadoop hdfs

我有一个对象负责在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();
    }
}

你之前有过这样的经历吗?

2 个答案:

答案 0 :(得分:3)

显然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();
    }
}

答案 1 :(得分:1)

好奇,但是如何重命名一个官方不存在的文件(因为你还在那时写作)?

修复是在文件完成后重命名。也就是说,当你调用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();
    }
}