在使用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=$' ';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 定时检查一下。