shell腳本監控Flume輸出到HDFS上文件合法性

在使用flume中發現因爲網絡、HDFS等其它緣由,使得通過Flume收集到HDFS上得日誌有一些異常,表現爲:shell

一、有未關閉的文件:以tmp(默認)結尾的文件。加入存到HDFS上得文件應該是gz壓縮文件,以tmp爲結尾的文件就沒法使用;網絡

二、有大小爲0的文件,好比gz壓縮文件大小爲0,咱們單獨拿下這個文件解壓發現是無限循環壓縮的。。。這個也不能直接用來跑mapreduceoop

目前發現上述兩種狀況,其它還暫未發現。至於出現上述狀況還沒明確緣由,且這兩種狀況都會影響hive、MapReduce的正常執行,2的話直接failed,1的話有可能丟失對應的數據。spa

針對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這樣的,大夥能夠根據本身的須要修改code

能夠使用crontab 定時檢查一下。blog

相關文章
相關標籤/搜索