hadoop 如何判断文件是否存在,目录是否存在,目录是否为空?

之前在做日志收集的时候遇见一个问题,一直没有解决,今天偶然间想起来这个问题解决一下。

将hdfs上的日志数据使用load命令加载到hive表中时,极少数情况下当某种日志类型缺失的时候,这种日志类型对应的路径为空,加载的时候会中断调度任务。

在Linux文件系统中,可以使用下面的Shell脚本判断某个文件是否存在:

# 这里的-f参数判断$file是否存在 
if [ ! -f "$file" ]; then
  echo "文件不存在!"
fi

那么再hadoop中如何处理呢?通过hadoop test命令帮助信息可以看到

[along@hdp14 bin]$ hadoop fs -help
...

-test -[defsz] <path> :
  Answer various questions about <path>, with result via exit status.
    -d  return 0 if <path> is a directory.
    -e  return 0 if <path> exists.
    -f  return 0 if <path> is a file.
    -s  return 0 if file <path> is greater         than zero bytes in size.
    -w  return 0 if file <path> exists         and write permission is granted.
    -r  return 0 if file <path> exists         and read permission is granted.
    -z  return 0 if file <path> is         zero bytes in size, else return 1.

根据帮助提示,我们可以使用对应的命令进行操作了

[along@hdp15 ~]$ hadoop fs -test -s /size/size
[along@hdp15 ~]$ echo $?
1
[along@hdp15 ~]$ 
[along@hdp15 ~]$ 
[along@hdp15 ~]$ hadoop fs -test -s /along/test
[along@hdp15 ~]$ echo $?
1
[along@hdp15 ~]$ hadoop fs -test -s /along/along1
[along@hdp15 ~]$ echo $?
1

通过上面的命令,可以判断文件是否存在,路径是否存在,那么怎么判断文件夹是为空呢?

方式一

[along@hdp15 bin]$ hadoop fs -count /along/along1
           1            1               1366 /along/along1
#输出列对应 DIR_COUNT, FILE_COUNT, CONTENT_SIZE, PATHNAME

方式二

[along@hdp15 bin]$ hadoop fs -du -s /along/along1
1366  4098  /along/along1

编写脚本

path=/size/size
isEmpty=$(hdfs dfs -count $path | awk '{print $2}') 
if [[ $isEmpty -eq 0 ]];then 
    echo "Given Path:$path is empty" 
else 
    echo "Given Path:$path is not empty" 
fi 

修改后的 脚本修改

#!/bin/bash
#--功能描述: 日志数据以天为单位从hdfs加载到ods层
#--创建者  :along
#--创建日期: 20210225
#--修改日期     修改人  修改内容
#--2021316      XX     xxxx
#--2021317  YY   xxx
##################################################

database=log_collection
hive=/xxx/xxx/parcels/CDH-5.8.5-1.cdh5.8.5.p0.5/lib/hive/bin/hive
hadoop=/xxx/xxx/parcels/CDH-5.8.5-1.cdh5.8.5.p0.5/lib/hadoop/bin/hadoop

# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
 if [ -n "$1" ] ;then
    do_date=$1
 else
    do_date=`date -d "-1 day" +%F`
fi

echo ==================$do_date  日志数据进行备份 ==================
$hadoop fs  -mkdir  /log_collect/topic_log/data/$do_date
$hadoop fs  -cp /log_collect/topic_log/$do_date/* /log_collect/topic_log/data/$do_date
echo ==================   日志数据备份完毕,开始向ods层加载数据==================

for type in {pageview,webclick,error,exposure}
do
    echo ==================$do_date  $type 类型的日志数据导入ods层 ==================
    
    #判断文件夹大小
    isEmpty=$(hdfs dfs -count /log_collect/topic_log/$do_date/$type | awk '{print $2}') 
    if [[ $isEmpty -eq 0 ]];then #为空
    	echo "------ Given Path:/log_collect/topic_log/$do_date/$type is empty" 

    else #不为空,加载数据

        sql="load data inpath '/log_collect/topic_log/$do_date/$type' into table $database.ods_"$type"_log partition (dt='$do_date');"
        $hive -e "$sql"
        $hadoop jar /xxx/xxx/parcels/GPLEXTRAS-5.8.5-1.cdh5.8.5.p0.5/lib/hadoop/lib/hadoop-lzo.jar com.hadoop.compression.lzo.DistributedLzoIndexer -Dmapreduce.job.queuename=hive /log_collection/ods/ods_"$type"_log/dt=$do_date
   	 fi
done
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐