1. 程式人生 > >異常斷電導致HDFS檔案塊丟失,影響HBASE資料的問題處理

異常斷電導致HDFS檔案塊丟失,影響HBASE資料的問題處理

這幾天一直看到HDFS提示檔案塊丟失的異常資訊,也一直沒有去關注,認為其他都正常。但是翻查HBASE入庫日誌的時候,發現了HBASE在提示入庫的異常資訊。聯想到HDFS的塊丟失問題,所以決定仔細檢查一下,一查不得了,果然檔案塊丟失的問題影響還很大。很多資料都無法入庫了。

通過命令檢查HDFS的丟失檔案塊

hdfs fsck / -list-corruptfileblocks

發現有25個檔案塊有問題,剛好都是HBASE資料儲存的檔案。還好我有備而來,翻出兩年前寫的hbase region 維護指令碼,來刪除異常的檔案塊和 hbase meta資訊。

if [ $# -lt 2 ]; then
	echo `date +"%Y-%m-%d %H:%M:%S"`  "Usage:<TABLENAME> <FILE>"
	exit 1
fi

TABLENAME=$1
FILE=$2

WORKPATH=/home/hadoop/turk/
LOGFILE=${WORKPATH}/log/hbase_export_sh.log

echo `date +"%Y-%m-%d %H:%M:%S"`  "-------------------------------------------" | tee -a $LOGFILE
echo `date +"%Y-%m-%d %H:%M:%S"`  "Delete Hbase Region & Meta 1.0 (2015-11-30)"     | tee -a $LOGFILE
echo `date +"%Y-%m-%d %H:%M:%S"`  "Delete"  | tee -a $LOGFILE
echo `date +"%Y-%m-%d %H:%M:%S"`  "-------------------------------------------"  | tee -a $LOGFILE
echo `date +"%Y-%m-%d %H:%M:%S"`  "Start..."  | tee -a $LOGFILE

cat $FILE | while read line 
do
#        echo "$line"
regionpath=/hbase/data/default/$1/`echo "$line" | awk -F ',' '{print $3}' | awk -F '.' '{print $2}'`
TABLENAME=`echo "$line" | awk -F ',' '{print $1}'`
echo "$regionpath"
echo "$line" 
hadoop fs -mv  $regionpath /tmp/hbase/delete
echo "deleteall 'hbase:meta','$line'" | hbase shell
done < $2
exit 0
通過hdfs檢查到丟失的檔案塊資訊,

/hbase/data/default/SDS_SESSION_STAT_HOUR/9362660da32bee2e8b3161ceeb3718a7/cf/6373445294bd42279bd83870abe8dd3a


9362660da32bee2e8b3161ceeb3718a7 在HBASE 元資料中找到了 這條記錄的元資料資訊

SDS_SESSION_STAT_HOUR,60.181.156.65_201603181400,1459818475992.9362660da32bee2e8b3161ceeb3718a7.

把這些元資料資訊寫入,指令碼的輸入檔案(第二個引數)中。

然後執行指令碼,刪除檔案,同時也刪除了元資料資訊

再通過 

hdfs fsck / -list-corruptfileblocks

檢查一次現在檔案塊丟失的情況,OK,由於指令碼中是先把這些檔案移動到 /tmp/hbase/delete目錄下,所以現在丟失的檔案塊都放在這個目錄下了,然後將這個目錄清了。

再做一次檢查,這個時候已經完成了修復。