在使用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 定時檢查一下。
