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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM