我有一个对象负责在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条答案
按热度按时间7dl7o3gd1#
显然地
FileSystem.rename(Path)
在本地模式下执行时会在路径上创建丢失的目录,但在群集模式下运行时不会。此代码在两种模式下都起作用:wvyml7n52#
只是好奇,但你怎么能重命名一个正式不存在的文件(因为你还在写)?
修复方法是在文件完成后重命名。也就是说,当您调用close方法时。
所以你的代码应该是这样的: