1. 程式人生 > >手工移除.META.表的錯誤資訊

手工移除.META.表的錯誤資訊

2012-09-05

周海漢/文

2012.9.5

從其他HBase資料庫中硬匯出了HDFS的HBase資料出來,但在新的cluster中hbase hbck -repair後,.META.表中還是有一些垃圾資料,導致region server不停寫日誌報告region表不存在,HBase建立刪除表奇慢。錯誤日誌量一天有幾個G。

通過過濾錯誤日誌,可以獲得錯誤的表名。

cat thelog | grep ERROR | sed ‘s/2012.=//’ | sed ‘s/, start..//’ | sort | uniq -d > errtable 過濾錯誤日誌中有表名的行,去掉其他頭尾,只剩下表名。並排序去重,還剩下幾十個錯誤的表名。

查詢HDFS中存在的表名 hadoop fs -ls /hbase/ | sed ‘s/hbase///’ > tables

comm -12 errtable tables

發現錯誤表都不存在於HDFS中。

所以程式設計將.META.表中多餘的錯誤表都清除即可。

人工移除.META.中大量錯誤表會很辛苦,所以寫了個程式。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.util.Bytes;
/*
author:zhouhh
根據字首清除表相應行
*/
public class DelTable {
 public static Configuration configuration;
    static {
        configuration = HBaseConfiguration.create();
        }
    public static void main(String[] args) {
        String pres="toplist";
    		ResultScanner rs = queryByPrefix(".META.",pres);
    		if(rs != null)
    		{
    			for (Result r : rs) {
    				String rk = new String(r.getRow());
                    System.out.println("queryed rowkey:" + rk);
                    delRow(".META.",rk);
    			}
    		}
    		else
    		{
    			System.out.println("rk not exist "+pres);
    		}
    	}
    	    public static ResultScanner queryByPrefix(String tableName,String pres) {

        try {
            HTablePool pool = new HTablePool(configuration, 1000);
            HTable table = (HTable) pool.getTable(tableName);
            Filter filter = new PrefixFilter(pres.getBytes());
            Scan s = new Scan();
            s.setFilter(filter);
            ResultScanner rs = table.getScanner(s);
            /*for (Result r : rs) {
                System.out.println("rowkey:" + new String(r.getRow()));
                for (KeyValue keyValue : r.raw()) {
                    System.out.println(new String(keyValue.getFamily())+":"+new String(keyValue.getQualifier())
                            + "t" + new String(keyValue.getValue()));


                }
            } */
            return rs;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;

    }
         public static void delRow(String tablename, String rowkey)  {
        try {
            HTable table = new HTable(configuration, tablename);
            List list = new ArrayList();
            Delete d1 = new Delete(rowkey.getBytes());
            list.add(d1);

            table.delete(list);
            System.out.println("deleted "+ rowkey);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

如非註明轉載, 均為原創. 本站遵循知識共享CC協議,轉載請註明來源