hadoop fs.trash 详解

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

linux系统里,我觉得最大的不方便之一就是没有回收站的概念。由rm -rf引发的血案,估计每个写代码的同学都遇到过。在hadoop或者说hdfs里面,有trash相关的概念,可以使得数据被误删以后,还可以找回来。

1.打开trash相关选项

hadoop里的trash选项默认是关闭的。所以如果要生效,需要提前将trash选项打开。修改conf里的core-site.xml即可。我们集群的相关配置如下:

    <!--Enabling Trash-->
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>
    <property>
        <name>fs.trash.checkpoint.interval</name>
        <value>1440</value>
    </property>

fs.trash.interval是在指在这个回收周期之内,文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。等到回收周期真正到了以后,hdfs才会将数据真正删除。默认的单位是分钟,1440分钟=60*24,刚好是一天。
fs.trash.checkpoint.interval则是指垃圾回收的检查间隔,应该是小于或者等于fs.trash.interval。

2.实际测试

xxx@hadoop-back lei.wang]$ hadoop fs -ls /tmp/wanglei/sqoop1
Found 2 items
-rw-r--r--   3 xxx supergroup          0 2016-03-11 14:44 /tmp/wanglei/sqoop1/_SUCCESS
-rw-r--r--   3 xxx supergroup         15 2016-03-11 14:44 /tmp/wanglei/sqoop1/part-m-00000

可以看到hdfs上有这么一个文件夹,然后我们先把他干掉

xxx@hadoop-back lei.wang]$ hadoop fs -rm -r /tmp/wanglei/sqoop1
16/05/20 21:38:18 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 1440 minutes.
Moved: 'hdfs://mycluster/tmp/wanglei/sqoop1' to trash at: hdfs://mycluster/user/xxx/.Trash/Current

同学们看到没有,这个时候,将这部分数据move到了hdfs上的一个地方,并没有真正删掉这部分数据。

[xxx@hadoop-back lei.wang]$ hadoop fs -ls /user/xxx/.Trash/Current/tmp/wanglei
Found 1 items
drwxr-xr-x   - xxx supergroup          0 2016-03-11 14:44 /user/xxx/.Trash/Current/tmp/wanglei/sqoop1

此时数据到了.Trash下面的某个路径。
如果我们刚才的操作是一时手残,想把数据弄回去,执行mv命令即可

hadoop fs -mv /user/xxx/.Trash/Current/tmp/wanglei/sqoop1 /tmp/wanglei/sqoop1

再查看一下,发现这部分数据又回来了

[xxx@hadoop-back lei.wang]$ hadoop fs -ls /tmp/wanglei/sqoop1
Found 2 items
-rw-r--r--   3 xxx supergroup          0 2016-03-11 14:44 /tmp/wanglei/sqoop1/_SUCCESS
-rw-r--r--   3 xxx supergroup         15 2016-03-11 14:44 /tmp/wanglei/sqoop1/part-m-00000

怎么样,很不错吧。有了Trash,再也不怕误删除了。个人感觉还是蛮好的。

Exception in thread "main" org.apache.hadoop.fs.ParentNotDirectoryException: Parent path is not a directory: file:/tmp at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:827) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.ChecksumFileSystem.mkdirs(ChecksumFileSystem.java:997) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:767) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:162) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:113) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:148) at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1678) at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1675) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1899) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1675) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1696) at com.inspur.sunqing.hadoop.mr.ProvinceCountApp.main(ProvinceCountApp.java:94)
05-14
<think>好的,我需要解决用户提到的Hadoop中的ParentNotDirectoryException异常。首先,我得回忆一下这个异常通常在什么情况下发生。根据经验,这个异常通常与文件路径有关,特别是当尝试在一个不是目录的路径下创建子目录或文件时。例如,如果用户试图在某个文件路径下创建子目录,而该路径实际上是一个文件,就会抛出这个异常。 接下来,我需要验证这个猜想是否正确。查阅Hadoop的文档或相关资源可能会有帮助。不过根据用户提供的引用,虽然引用的内容中没有直接提到ParentNotDirectoryException,但引用[1]提到权限问题,引用[3]涉及HDFS的设计,引用[4]涉及内存问题,这可能与资源管理有关,但可能不直接相关。不过,用户的问题是关于路径的,所以应该聚焦在路径处理上。 可能的解决方法包括检查目标路径是否存在,以及确认父路径是否为目录。例如,如果用户尝试创建路径/hadoop/data/file.txt/data,而/hadoop/data/file.txt已经是一个文件,那么创建子目录data就会失败,因为file.txt不是目录。这时候需要检查路径是否正确,或者删除已存在的同名文件。 此外,权限问题也可能导致异常,如引用[1]中提到的权限不足,但ParentNotDirectoryException更可能是路径结构问题。不过,确保用户有足够的权限写入父目录也是必要的。 需要分步骤说明解决方法,比如检查路径是否存在,确认父路径是目录而不是文件,处理已存在的同名文件,检查权限设置,以及验证路径格式是否正确。同时,可能需要提供Hadoop命令示例,如hadoop fs -ls和hadoop fs -rm来帮助用户操作。 另外,用户可能需要了解如何避免此类异常,例如在编程时先检查父路径是否为目录,或者使用API正确创建目录结构。例如,在Java中使用FileSystem.mkdirs()方法前,先检查父路径是否存在且为目录。 总结来说,解决方案应围绕路径验证、文件与目录的区分、权限检查和正确的API使用展开。同时,结合用户提供的引用,虽然引用内容不直接相关,但可以强调在HDFS操作中路径和权限的重要性,如引用[1]中的权限修改命令可能在某些情况下辅助解决问题。</think>### Hadoop中ParentNotDirectoryException异常的原因及解决方法 #### 异常原因 当HDFS客户端尝试在**非目录路径下创建子目录或文件**时,会触发$ParentNotDirectoryException$。具体场景包括: 1. 目标路径的父级路径是文件而非目录(例如路径为`/data/file.txt/subdir`,但`file.txt`是一个文件) 2. 编程接口错误调用(如使用`create()`方法时路径层级错误) 3. 并发操作导致路径状态冲突(需结合日志分析) #### 解决步骤 1. **验证路径结构** ```bash hadoop fs -ls <父级路径> ``` 如果返回结果中父级路径类型显示为`-rw-r--r--`(文件),则需删除该文件: ```bash hadoop fs -rm <父级路径> ``` 2. **创建缺失的父目录** ```bash hadoop fs -mkdir -p <父级目录路径> ``` 使用`-p`参数自动创建多级目录,例如: ```bash hadoop fs -mkdir -p /user/hadoop/data/input ``` 3. **检查API调用逻辑** 在Java代码中,优先使用`FileSystem.mkdirs()`创建目录: ```java Path parentPath = new Path("/user/hadoop/data"); if (!fs.exists(parentPath)) { fs.mkdirs(parentPath); // 创建多级目录 } Path targetPath = new Path(parentPath, "newfile.txt"); FSDataOutputStream out = fs.create(targetPath); // 正确创建文件 ``` 4. **处理权限问题** 若父目录权限不足(如引用[1]中提到的权限问题),需调整权限: ```bash hadoop fs -chmod 755 /user/hadoop/data ``` #### 典型案例 假设试图上传文件到路径`hdfs://namenode/user/test.csv/output`,但`test.csv`已存在且是文件。此时: 1. 删除冲突文件:`hadoop fs -rm /user/test.csv` 2. 创建合法目录:`hadoop fs -mkdir -p /user/output` 3. 重新执行文件上传操作 #### 附加建议 - 使用`hadoop fs -test -d <路径>`命令验证路径类型 - 在代码中增加路径预检查逻辑 - 参考HDFS Federation设计(如引用[3]),注意跨集群路径映射问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值