要想很好的理解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();
}