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

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
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值