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 do
14     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" ];then
19         echo "${fileAllName} 's size is ${size} ..... delete it!"
20         ${HADOOP_HOME}/bin/hadoop fs -rmr ${fileAllName}
21     fi
22     if [ "${tmp}" == ".tmp" ];then
23         ${HADOOP_HOME}/bin/hadoop fs -mv ${fileAllName} ${fileNameNoTmp}
24         echo "${fileAllName} has changed to ${fileNameNoTmp}......."
25     fi
26 done

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

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

posted @ 2014-12-11 12:11  玖疯  阅读(...)  评论(...编辑  收藏