通過命令檢查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
/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目錄下,所以現在丟失的文件塊都放在這個目錄下了,然後將這個目錄清了。
再做一次檢查,這個時候已經完成了修復。