刚才不小心操作删除了HDFS中的一个目录文件,百度了一些,发现找回其实挺简单的,笔者提供两种方法:1.通过终端命名;2.使用HDFS的API
相关知识
在HDFS中删除的文件不会马上直接删除掉,而是将其移动到了一个名为Trash的目录下,这种原理相当于电脑总的回收站机制,现在需要做的就是从回收站中将我们删除的文件还原出来。
在hadoop中的trash机制需要在配置文件core-site.xml中配置,具体配置如下,其中中的值表示的是杀出文件多久后,HDFS会永久清楚该文件,相当于此时你杀出了a.txt,那么在10080这个时间后,文件将会被永久的删除。不设置的话,默认6小时(这个需要勘误,因为我放了一晚上,第二天早上起来回复还在。。。)。
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
在终端使用命令找回HDFS中(误)删除文件
通过终端找回这种方法很简单,就是移动文件(夹)罢了,命令和HDFS的操作差不多,现在比如我删除的文件名字叫/air/sampledata,那么我找回来的命令是:
hadoop fs -mv /user/root/.Trash/Current/air/sampledata /air/sampledata
需要注意的是/user/root 这里的root是我hadoop的用户,相应的更改。第一行和第二行有一个空格(熟悉mv 命令的,不解释。)
使用Java API回收HDFS(误)删除文件
使用Java API这种方法,其实也即是操作HDFS,在HDFS间移动文件夹罢了,代码如下:
/**
* 根据新旧路径进行更名
* @param oldPathName 原始文件路径
* @param newPathName 现在文件路径
* @return 成功返回true, 失败返回false
* @throws IOException
*/
public boolean rename(String oldPathName, String newPathName) throws IOException {
if (!exits(oldPathName)){
System.out.println("file is not exits.");
return false;
}
fs.rename(new Path(oldPathName), new Path(newPathName));
return true;
}
关于HDFS 的Java API,具体的可以参考我的另一篇博客:HDFS java API
传入参数的时候,oldpath 填入”/user/root/.Trash/Current/air/sampledata”,新的path传需要恢复到的HDFS原始目录。