HBase 如何Debug region

来源:互联网 发布:win10不显示可用网络 编辑:程序博客网 时间:2024/05/14 11:55

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




原创粉丝点击