手工移除.META.表的錯誤資訊
阿新 • • 發佈:2018-12-23
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協議,轉載請註明來源