对于项目要求,我需要提取所有区域的HBase元数据。 精确地针对每个区域,我需要以下字段:
所以我想出了这个解决方案:
List<HTableDescriptor> hTableDescriptors = Arrays.asList(admin.listTables());
for (HTableDescriptor hTableDescriptor : hTableDescriptors) {
TableName name = hTableDescriptor.getTableName();
List<HRegionInfo> tableRegions = admin.getTableRegions(name);
LOG.info("Found {} regions",tableRegions.size());
for (HRegionInfo region : tableRegions) {
RegionDetailInfo detailInfo = new RegionDetailInfo();
detailInfo.setSchemaName(name.getNamespaceAsString());
detailInfo.setTableName(name.getNameAsString());
detailInfo.setEncodeName(region.getEncodedName());
detailInfo.setStartKey(Bytes.toString(region.getStartKey()));
detailInfo.setEndKey(Bytes.toString(region.getEndKey()));
/* other stuff */
}
}
这里的问题是语句:admin.getTableRegions(name);
需要为每个桌子建立一个Zookeeper连接。
因此,读取元数据非常慢。
还有其他方法可以完成相同的任务吗?