作者:罗康

1     文档编写目的

本文主要讲述如何使用Shell脚本判断HDFS文件或目录是否存在,算是一个小技巧吧,这几天做PoC的时候感觉还挺有用的。因为HDFS设计的是“一次写入,多次读取”,不可以修改数据,只能追加或者删除,所以,如果目标文件或目录在HDFS上已经存在的话,则无法创建成功。

 

测试环境:

操作系统版本为Redhat7.2

CM和CDH版本为5.11.2

 

文章目录结构:

    1.  文档编写目的

    2.  测试原理

    3.  Shell脚本测试

    3.1 测试路径是否存在

    3.2 测试目录是否存在

    3.3 测试文件是否存在

    4.  总结


2     测试原理

通过hadoop fs -test来判断文件或者目录是否存在,一次只能传递一个测试参数。

Usage: hadoop fs -test -[defsz] URI

-test: Only one test flag is allowed

Options:

-d: if the path is a directory, return 0.

-e: if the path exists, return 0.

-f: if the path is a file, return 0.

-s: if the path is not empty, return 0.

-z: if the file is zero length, return 0.

比如判断HDFS上的某个文件目录是否存在,可以执行如下命令:

hadoopfs -test -d $path  #判断目录是否存在

hadoopfs -test -e $path  #判断路径(文件或者目录)是否存在

 

3     Shell脚本测试

3.1  测试路径是否存在

1、准备测试目录,包含一个文件和一个文件夹


[root@bigdata60 ~]# hadoop fs -ls  /user/wdtest

Found 2 items

drwxr-xr-x   - fusionuser wdtest          0 2018-07-03 13:26  /user/wdtest/.fusion

-rw-r--r--   3 fusionuser wdtest        908 2018-07-06 22:37  /user/wdtest/hosts

如何使用Shell脚本判断HDFS文件/目录是否存在_hadoop

2、编写测试脚本如下:

#!/bin/sh

 

path=$1

 

hadoop fs -test -e $path

if [ $? -eq 0 ]; then

   echo "Path is exist!"

else

   echo "Path is not exist!"

fi

3、执行“./etest.sh /user/wdtest”命令,运行测试脚本,验证输出结果

如何使用Shell脚本判断HDFS文件/目录是否存在_hdfs_02

3.2 测试目录是否存在

1、编写测试脚本如下:

#!/bin/sh

 

path=$1

 

hadoop fs -test -d $path

if [ $? -eq 0 ]; then

   echo "Directory is exist!"

else

   echo "Directory is not exist!"

fi

2、分别执行“./dtest.sh /user/wdtest”命令和“./dtest.sh /user/wdtest/aa”命令,运行测试脚本,验证输出结果

如何使用Shell脚本判断HDFS文件/目录是否存在_测试脚本_03

3.3 测试文件是否存在

1、编写测试脚本如下:

#!/bin/sh

 

path=$1

 

hadoop fs -test -f $path

if [ $? -eq 0 ]; then

   echo "File is exist!"

else

   echo "File is not exist!"

fi

2、分别执行“./ftest.sh /user/wdtest/hosts”命令和“./dtest.sh /user/wdtest/host”命令,运行测试脚本,验证输出结果

如何使用Shell脚本判断HDFS文件/目录是否存在_hadoop_04

 

4     总结

1、通过hadoop fs -test -[defsz] URI 可以判断HDFS文件或目录是否存在,-test一次只能传递一个测试参数,不能执行类似 hadoop fs -test -dfURI或者hadoop fs -test -d -f URI这种命令;

2、hadoop fs -test -[defsz] URI 返回值是不输出的,需要通过“$?”这个特殊变量获取返回值;

3、-s和-z命令我测试过,但觉得不怎么常用,所以没在文章中讲述,有兴趣可以自己测一下,比较简单,更换一下脚本参数即可;

4、判断HDFS文件目录是否存在后,可以执行比如创建、删除目录或文件等操作,当然还有一些更高级的玩法,这里就不演示了。






When your talent can’t support your ambition,You should calm down and learn.
When your ability cannot realize you dreams,
You should practice with all your heart.
Ask yourself,
What kind of life you pursue.