这几天一直看到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
/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目录下,所以现在丢失的文件块都放在这个目录下了,然后将这个目录清了。
再做一次检查,这个时候已经完成了修复。