HBase 如何Debug region

要想很好的理解HBase的代碼,Debug Hbase的源碼是最簡單的方式,但很可惜的是HBase不能在Windows上運行(除非cygwin),即使用cygwin配置起來也很麻煩。而且即使用cygwin,HBase中最核心最關鍵的代碼region部分也很難debug。

不過,本文提供的方法可以輕鬆在本地創建region對象,然後就可以直接調用方法進行debug啦。

首先說下原理:


我們知道Hbase中Master和RegionServer的主要作用就是partition、rpc,而每個Region可以看作一個微型的數據庫內核。

region是相對獨立的,接收上層的regionserver的指令。

這邊Hbase做的很好,每個region可以只通過hdfs上的文件和目錄初始化出來。

因此,我們首先要用hbaseclient的方式建立一張表。然後取出需要debug的region名字(從hdfs上讀),最後以下幾行代碼就可創建一個自己獨立的region對象。有了對象我們就能想幹嗎幹嗎啦,put,get,scan.flush,compact,split隨便debug~

            //初始化配置文件
	    SpliterConfigurationFactory confFactory = SpliterConfigurationFactory.getInstance();
	    Configuration conf = confFactory.getSpliterConfiguration();
	    
	    //獲得hbase的根目錄,表名,初始化MetaUtil對象
	    Path rootdir = FSUtils.getRootDir(conf);
	    byte[] tableName = Bytes.toBytes("testmerge");
	    MetaUtils utils = new MetaUtils(conf);
	    //初始化 tableDescriptor對象
	    HTableDescriptor htd = FSTableDescriptors.getTableDescriptor(FileSystem.get(conf),
	  	      rootdir, tableName);
	    
	    // 拿到 該region的regionInfo,這邊可以有很多方式。Hbase提供了很多方式
	    HTable table = new HTable(conf,tableName);
	    HRegionInfo ri = CommonTableUtil.getRegionInfo(Bytes.toBytes("testmerge,,1354183028220.9e1c0fd860d9dc5cd84c05831d770928."), table);
	    //獲得Hlog對象
	    HLog log = utils.getLog();   
	    // 創建HRegion對象!!
	    HRegion r1 = HRegion.openHRegion(ri, htd, log, conf);
	    // Flush Region
	    r1.flushcache();
	    //r1.put(put);
	    
	    // Scan Region
	    Scan scan = new Scan();
	    InternalScanner s = r1.getScanner(scan);
	    try {
	      List<KeyValue> results = new ArrayList<KeyValue>();
	      boolean hasNext = true;
	      do {
	        hasNext = s.next(results);
	        for (KeyValue kv: results) {
	          System.out.println(Bytes.toStringBinary(kv.getRow()));
	          System.out.println(Bytes.toStringBinary(kv.getValue()));
	        }
	        results.clear();
	      } while (hasNext);
	    } finally {
	      s.close();
	    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章