首页 > 代码库 > shell脚本监控Flume输出到HDFS上文件合法性

shell脚本监控Flume输出到HDFS上文件合法性

在使用flume中发现由于网络、HDFS等其它原因,使得经过Flume收集到HDFS上得日志有一些异常,表现为:

1、有未关闭的文件:以tmp(默认)结尾的文件。加入存到HDFS上得文件应该是gz压缩文件,以tmp为结尾的文件就无法使用;

2、有大小为0的文件,比如gz压缩文件大小为0,我们单独拿下这个文件解压发现是无限循环压缩的。。。这个也不能直接用来跑mapreduce

目前发现上述两种情况,其它还暂未发现。至于出现上述情况还没明确原因,且这两种情况都会影响hive、MapReduce的正常执行,2的话直接failed,1的话有可能丢失对应的数据。

针对2直接删掉就行;1中的情况我们发现直接去掉tmp后缀是可以的。为此编写了一个shell脚本,定时检查HDFS上得文件发现1就去掉tmp后缀,发现2就删除文件,脚本如下:

 1 #!/bin/sh 2  3 cd `dirname $0` 4  5 date=`date -d "1 day ago" +%Y/%m/%d` 6 echo " date is ${date}" 7 HADOOP_HOME=/usr/lib/hadoop-0.20-mapreduce/ 8 dataDir=/data/*/ 9 echo "dir is ${dataDir}"10 echo "check hdfs file is crrect?"11 12 IFS=$‘\n‘;for name in `${HADOOP_HOME}/bin/hadoop fs -ls ${dataDir}${date}`13 do14     size=`echo "${name}" | awk ‘{print $5}‘`15     fileAllName=`echo "${name}" | awk ‘{print $8}‘`16     fileNameNoTmp=`echo ${fileAllName%.tmp*}`17     tmp=`echo ${fileAllName#*.gz}`18     if [ "${size}" == "0" ];then19         echo "${fileAllName} ‘s size is ${size} ..... delete it!"20         ${HADOOP_HOME}/bin/hadoop fs -rmr ${fileAllName}21     fi22     if [ "${tmp}" == ".tmp" ];then23         ${HADOOP_HOME}/bin/hadoop fs -mv ${fileAllName} ${fileNameNoTmp}24         echo "${fileAllName} has changed to ${fileNameNoTmp}......."25     fi26 done

注:上述的地8行,hdfs支持正则的。上述的HDFS目录是:/data/*/2014/12/08这样的,大伙可以根据自己的需要修改

可以使用crontab 定时检查一下。

shell脚本监控Flume输出到HDFS上文件合法性