2

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

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

有什么建议么 ?

4

2 回答 2

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
  }
}
于 2013-01-29T17:58:24.643 回答
0

What's wrong with the default Load Balancer?

From the Wiki:

The balancer is a periodic operation which is run on the master to redistribute regions on the cluster. It is configured via hbase.balancer.period and defaults to 300000 (5 minutes).

If you really want to do it yourself you could indeed use the Hadoop API and more specifally, the FileStatus class. This class acts as an interface to represent the client side information for a file.

于 2013-01-29T08:01:21.187 回答