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