检查HDFS中的目录是否已存在

时间:2014-10-22 17:50:41

标签: shell hadoop scripting hdfs

我在HDFS中有以下目录结构,

/analysis/alertData/logs/YEAR/MONTH/DATE/HOURS

即数据即将发布,并以年/月/日/小时的格式存储。

我写了一个shell脚本,我将路径传递到

"/analysis/alertData/logs"   ( this will vary depending on what product of data i am handling)

然后shell脚本遍历年/月/日/小时文件夹并返回最新路径。

例如:

 Directories present in HDFS has following structure: 

 /analysis/alertData/logs/2014/10/22/01
 /analysis/alertData/logs/2013/5/14/04

 shell script is given path till :   " /analysis/alertData/logs "

 it outputs most recent directory :    /analysis/alertData/logs/2014/10/22/01

我的问题是如何验证HDFS目录路径传递给shell脚本是否有效。让我说我传递一个错误的路径作为输入或路径不存在所以如何在shell脚本中处理它。

示例错误路径可以是:

  wrong path   :  /analysis/alertData ( correct path :  /analysis/alertData/logs/ )
  wrong path   :  /abc/xyz/  ( path does not exit in HDFS )

我尝试使用Hadoop dfs -test -z / -d / -e选项对我没用。 对此有任何建议。

注意:不在此处发布我的原始代码,因为我的问题的解决方案不依赖于它。

提前致谢。

5 个答案:

答案 0 :(得分:21)

尝试使用w / o测试命令[]:

if $(hadoop fs -test -d $yourdir) ; then echo "ok";else echo "not ok"; fi

答案 1 :(得分:4)

您好我使用以下脚本来测试HDFS目录是否存在。我在你的问题中看到你尝试过这个测试命令并没有奏效。你能否提供一些关于为什么不起作用的追踪......

 hadoop fs -test -d $dirpath
    if [ $? != 0 ]
            then
                hadoop fs -mkdir $dirpath
                else
                    echo "Directory already present in HDFS"
    fi

答案 2 :(得分:4)

Hadoop fs已弃用 用法:hdfs dfs -test - [ezd] URI

选项: -e选项将检查文件是否存在,如果为true则返回0。 -z选项将检查文件是否为零长度,如果为true则返回0。 -d选项将检查路径是否为目录,如果为true则返回0。 示例:hdfs dfs -test -d $ yourdir

请查看以下内容以获取更多信息:https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/FileSystemShell.html 此致

答案 3 :(得分:0)

适用于带有火花的 Scala。

import org.apache.hadoop.fs.{FileSystem, Path}
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
val fileExists = fs.exists(new Path(<HDFSPath>)) //return boolean of true or false

答案 4 :(得分:-1)

在Java中,我们可以使用FileSystem类来验证这一点。

FileSystem