我有一个对象负责在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();
}
}
你之前有过这样的经历吗?
答案 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();
}
}