hadoop 如何判断文件是否存在,目录是否存在,目录是否为空?
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
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 年前
更多推荐
已为社区贡献1条内容
所有评论(0)