我正在尝试使用HBase API来获取“表”的“区域名称”。
设置如下所述:
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();
}
}
您的代码每次都会产生不同的结果,因为您每次都在构建带有不同时间戳的新“区域”。该代码还假定您的表具有单个区域。