我正在尝试使用HBase API来获取“表”的“区域名称”。

设置如下所述:

  • Hbase伪分布式安装(版本0.98.7)。
  • Hadoop 2.5.1安装。

  • Hbase包含很少的用于测试目的的表。 Web界面下方显示了有关可用区域的信息。

    与表“test_table”相对应的“区域名称”已被有意突出显示。

    现在,我一直在尝试使用以下代码从hbase的基于Java的API获取这些区域信息。
    void scanTable(String tabName){
    
            org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create();
            try{
                HTable table = new HTable(config, tabName);
                org.apache.hadoop.hbase.TableName tn = table.getName();
    
                HRegionInfo hr =  new HRegionInfo(tn);
                System.out.println(hr.getRegionNameAsString());
    
                table.close();
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
    

    每当我传递一个表名,例如“test_table”时,每次运行都会以不同的方式返回regionName。

    运行1:
    test_table,,1419247657866.77b98d085239ed8668596ea659a7ad7d.
    

    运行2:
    test_table,,1419247839479.d3097b0f4b407ca827e9fa3773b4d7c7.
    

    运行3:
    test_table,,1419247859921.e1e39678fa724d7168cd4100289c4234.
    

    我假设我使用错误的方法来生成“region_name”,或者我的方法是错误的。
    请帮助我获取给定表名的区域信息。

    最佳答案

    HBaseAdmin中有一个getTableRegions(),它返回所需表名的所有区域信息。

    列出getTableRegions(最终的TableName tableName)

    下面是输出给定表名的区域名的方法。

    void getRegionOfTable(String tabName){
        org.apache.hadoop.hbase.TableName tn = org.apache.hadoop.hbase.TableName.valueOf(tabName);
        org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create();
        HRegionInfo ob;
        try{
            HBaseAdmin hba = new HBaseAdmin(config);
            List<HRegionInfo> lr = hba.getTableRegions(tn);
            Iterator<HRegionInfo> ir = lr.iterator();
            while(ir.hasNext()){
                ob = ir.next();
                System.out.println(ob.getRegionNameAsString());
            }
            hba.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    

    您的代码每次都会产生不同的结果,因为您每次都在构建带有不同时间戳的新“区域”。该代码还假定您的表具有单个区域。

    07-24 09:49
    查看更多