我正在尝试为Hbase编写一个平衡器工具,它可以按区域计数和/或区域大小(storeFile大小的总和)平衡regionServers上的区域。我找不到任何返回区域大小或相关信息的Hbase API类。我已经检查了一些可用于获取其他表/区域信息的类,例如org.apache.hadoop.hbase.client.HTable和HBaseAdmin。
我在想,另一种可以实现的方法是使用一个Hadoop类,它返回文件系统中目录的大小,例如: org.apache.hadoop.fs.FileSystem列出特定HDFS路径下的文件。
有什么建议吗?
答案 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
类。此类充当表示文件的客户端信息的接口。