hbase的admin接口提供了一系列可以获得集群访问状态的api,如果是做hbase的集群监控系统,通过这些api或许可以帮你获得关于当前集群访问情况的数据,并简单介绍这些api返回的信息和一些使用姿势。
admin.listTableNames():返回集群的table列表
admin.getClusterStatus():返回一个ClusterStatus类,该类描述了集群整体的一些状态,部分有用的状态列出如下:
regionserver的数量:clusterStatus.getServerSize();
regionserver的列表:clusterStatus.getServers(),返回类型:List
挂掉的regionserver数量:clusterStatus.getDeadServers();
挂掉的regionserver名字:clusterStatus.getDeadSErverNames(),返回类型:ServerName
region的数量:clusterStatus.getRegionsCount();
平均负载:clusterStatus.getAverageLoad();
已知regionserver的名字,可以获取regionserver上的负载信息,具体方法如下:
ServerLoad serverload = clusterStatus.getLoad(serverName);
serveLoad中维护了关于当前regonserver的一些负载信息,常用的如下:
读请求计数:serverLoad.getReadRequestsCount();
写请求计数:serverLoad.getWriteRequestsCount();
每秒请求数:serverLoad.getRequestsPerSecond();
关键是从serverLoad中可以获得regionload列表,如下一段代码演示了如何获取regionload列表并按region名称归类
ClusterStatus clusterStatus = admin.getClusterStatus();
for(ServerName serverName : clusterStatus.getServers()) {
ServerLoad serverLoad = clusterStatus.getLoad(serverName);
for(Map.Entry regionload : serverLoad.getRegionsLoad().entrySet()) {
String regionName = Bytes.toString(regionload.getKey());
result.put(regionName, regionload.getValue());
}
}
regionLoad与serverLoad类似,维护了region的一些负载信息,常用如下:
读请求计数:regionLoad.getReadRequestsCount();
写请求计数:regionLoad.getWriteRequestsCount();
regon名称:regionLoad.getNameAsString();
请求总计数:regionLoad.getRequestsCount();
该region所属的table名:regionLoad.getNameAsString().split(",")[0]
以下一段代码演示了依据表名获取归属该表的region,并将这些region按照regionserver进行归类:
Map> result = new HashMap<>();
try {
ClusterStatus clusterStatus = admin.getClusterStatus();
for(ServerName serverName : serverNames) {
List regions = new ArrayList<>();
ServerLoad serverLoad = clusterStatus.getLoad(serverName);
Map regionLoads = serverLoad.getRegionsLoad();
for(Map.Entry entry : regionLoads.entrySet()) {
String uniqueName = new String(entry.getKey()).split(",")[0]; //该region所属的table名;
if (uniqueName.equals(tableName)) {
regions.add(new String(entry.getKey()));
}
}
result.put(serverName.getServerName(), regions);
}
} finally {
if(admin != null) {admin.close();}
}