From 3a99c39889f66146157973186aaca0283787c094 Mon Sep 17 00:00:00 2001 From: liyintang Date: Tue, 21 Feb 2012 22:17:34 -0800 Subject: [PATCH] hbase-5438 --- bin/region_balance_checker.rb | 111 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 111 insertions(+), 0 deletions(-) create mode 100644 bin/region_balance_checker.rb diff --git bin/region_balance_checker.rb bin/region_balance_checker.rb new file mode 100644 index 0000000..4986a5f --- /dev/null +++ bin/region_balance_checker.rb @@ -0,0 +1,111 @@ +# List the region balance information about one specific table +# +# ${HBASE_HOME}/bin/hbase org.jruby.Main region_balance_checker TABLENAME + +TABLE_NAME=ARGV[0] + +unless TABLE_NAME + print "USAGE: #{$0} TABLE \n" + exit 1 +end + +require 'java' + +import org.apache.hadoop.hbase.HBaseConfiguration +import org.apache.hadoop.hbase.HConstants +import org.apache.hadoop.hbase.client.HTable +import org.apache.hadoop.hbase.client.Scan +import org.apache.hadoop.hbase.util.Bytes +import org.apache.hadoop.hbase.util.Writables +import java.util.HashMap +import java.util.HashSet +import java.util.Iterator + +log_level = org.apache.log4j.Level::ERROR +org.apache.log4j.Logger.getLogger("org.apache.zookeeper").setLevel(log_level) +org.apache.log4j.Logger.getLogger("org.apache.hadoop.hbase").setLevel(log_level) + +config = HBaseConfiguration.new +config.set 'fs.default.name', config.get(HConstants::HBASE_DIR) +JAVA_TABLE_NAME=TABLE_NAME.to_java_bytes +INFO_FAMILY = 'info'.to_java_bytes +REGION_INFO_COLUMN = 'regioninfo'.to_java_bytes +SERVER_COLUMN = 'server'.to_java_bytes +NO_SERVER = "no server" + +table = HTable.new config, '.META.'.to_java_bytes + +scan = Scan.new +scan.addColumn INFO_FAMILY, REGION_INFO_COLUMN +scan.addColumn INFO_FAMILY, SERVER_COLUMN +scanner = table.getScanner scan +region_server_map = HashMap.new + +print "======== Table: %s ==========\n" % [TABLE_NAME] + while row = scanner.next + region = Writables.getHRegionInfo row.getValue(INFO_FAMILY, REGION_INFO_COLUMN) + next unless (!region.nil? && Bytes.equals(region.getTableDesc.getName, JAVA_TABLE_NAME)) + server_bytes = row.getValue(INFO_FAMILY, SERVER_COLUMN) + server = server_bytes ? String.from_java_bytes(server_bytes) : NO_SERVER + region_count = region_server_map.get(server) + if region_count.nil? + region_server_map.put(server, 1) + else + region_server_map.put(server, (region_count + 1)) + end +end +scanner.close + +total_region_count = 0 +min_region_count = java.lang.Integer::MAX_VALUE +min_region_server = HashSet.new +max_region_count = 0 +max_region_server = HashSet.new +e = region_server_map.entrySet().iterator() + +no_server_count = region_server_map.get(NO_SERVER) +if not no_server_count.nil? + print "%s regions are unassigned now ! " % [no_server_count] + region_server_map.remove(NO_SERVER) +end + +while e.hasNext() + entry = e.next() + current_region_server = entry.getKey() + current_region_count = entry.getValue() + total_region_count = total_region_count + current_region_count + + if (current_region_count >= max_region_count) + if (current_region_count > max_region_count) + max_region_server.clear + max_region_count = current_region_count + end + max_region_server.add(current_region_server) + end + + if (current_region_count <= min_region_count) + if (current_region_count < min_region_count) + min_region_server.clear + min_region_count = current_region_count + end + min_region_server.add(current_region_server) + end +end + +print "Total region count: %s \n" % [total_region_count] +print "Avg region count: %s \n" % [total_region_count / region_server_map.size()] +print "Max region count: %s \n" % [max_region_count] +print "They are: " +e = max_region_server.iterator() +while e.hasNext() + print "%s \t" % [e.next()] +end + +print "\n\Min region count: %s \n" % [min_region_count] +print "They are: " +e = min_region_server.iterator() +while e.hasNext() + print "%s \t" % [e.next()] +end +print "\n" + -- 1.7.4