通过API获取Hbase区域大小

时间:2013-01-28 23:59:54

标签: hadoop hbase

我正在尝试为Hbase编写一个平衡器工具,它可以按区域计数和/或区域大小(storeFile大小的总和)平衡regionServers上的区域。我找不到任何返回区域大小或相关信息的Hbase API类。我已经检查了一些可用于获取其他表/区域信息的类,例如org.apache.hadoop.hbase.client.HTable和HBaseAdmin。

我在想,另一种可以实现的方法是使用一个Hadoop类,它返回文件系统中目录的大小,例如: org.apache.hadoop.fs.FileSystem列出特定HDFS路径下的文件。

有什么建议吗?

2 个答案:

答案 0 :(得分:7)

我使用它来进行区域的托管拆分,但是,您可以利用它来自行进行负载平衡。我还对自己进行负载平衡,以便在我们的节点之间均匀地分布(给定表格的)区域,以便MR作业均匀分布。

下面的代码段可能很有用吗?

final HBaseAdmin admin = new HBaseAdmin(conf);
final ClusterStatus clusterStatus = admin.getClusterStatus();

for (ServerName serverName : clusterStatus.getServers()) {
  final HServerLoad serverLoad = clusterStatus.getLoad(serverName);

  for (Map.Entry<byte[], HServerLoad.RegionLoad> entry : serverLoad.getRegionsLoad().entrySet()) {
    final String region = Bytes.toString(entry.getKey());
    final HServerLoad.RegionLoad regionLoad = entry.getValue();
    long storeFileSize = regionLoad.getStorefileSizeMB();
    // other useful thing in regionLoad if you like
  }
}

答案 1 :(得分:0)

默认Load Balancer有什么问题?

来自Wiki:

平衡器是一个定期操作,在主服务器上运行以重新分配集群上的区域。它通过hbase.balancer.period配置,默认为300000(5分钟)。

如果您真的想自己动手,那么您确实可以使用Hadoop API以及更具体的FileStatus类。此类充当表示文件的客户端信息的接口。