Repository: hbase Updated Branches: refs/heads/master 2026540ea -> 7d819eb72
HBASE-14925 (Addendum) Develop HBase shell command/tool to list table's region info through command line Signed-off-by: Ashish Singhi <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/7d819eb7 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/7d819eb7 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/7d819eb7 Branch: refs/heads/master Commit: 7d819eb722dc7d027f98357f8b12d166a3f7723b Parents: 2026540 Author: Karan Mehta <[email protected]> Authored: Fri May 5 23:33:30 2017 +0530 Committer: Ashish Singhi <[email protected]> Committed: Fri May 5 23:33:30 2017 +0530 ---------------------------------------------------------------------- .../main/ruby/shell/commands/list_regions.rb | 110 +++++++++++++++++-- 1 file changed, 98 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/7d819eb7/hbase-shell/src/main/ruby/shell/commands/list_regions.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/list_regions.rb b/hbase-shell/src/main/ruby/shell/commands/list_regions.rb index 892653e..f2d4b41 100644 --- a/hbase-shell/src/main/ruby/shell/commands/list_regions.rb +++ b/hbase-shell/src/main/ruby/shell/commands/list_regions.rb @@ -25,17 +25,24 @@ module Shell return<<EOF List all regions for a particular table as an array and also filter them by server name (optional) as prefix and maximum locality (optional). By default, it will return all the regions for the table with any locality. + The command displays server name, region name, start key, end key, size of the region in MB, number of requests + and the locality. The information can be projected out via an array as third parameter. By default all these information + is displayed. Possible array values are SERVER_NAME, REGION_NAME, START_KEY, END_KEY, SIZE, REQ and LOCALITY. Values + are not case sensitive. If you don't want to filter by server name, pass an empty hash / string as shown below. Examples: hbase> list_regions 'table_name' hbase> list_regions 'table_name', 'server_name' hbase> list_regions 'table_name', {SERVER_NAME => 'server_name', LOCALITY_THRESHOLD => 0.8} + hbase> list_regions 'table_name', {SERVER_NAME => 'server_name', LOCALITY_THRESHOLD => 0.8}, ['SERVER_NAME'] + hbase> list_regions 'table_name', {}, ['SERVER_NAME', 'start_key'] + hbase> list_regions 'table_name', '', ['SERVER_NAME', 'start_key'] EOF return end - def command(table_name, options = nil) + def command(table_name, options = nil, cols = nil) if options.nil? options = {} elsif not options.is_a? Hash @@ -43,6 +50,34 @@ EOF # and create the hash internally options = {SERVER_NAME => options} end + + size_hash = Hash.new + if cols.nil? + size_hash = { "SERVER_NAME" => 12, "REGION_NAME" => 12, "START_KEY" => 10, "END_KEY" => 10, "SIZE" => 5, "REQ" => 5, "LOCALITY" => 10 } + elsif cols.is_a?(Array) + cols.each do |col| + if col.upcase.eql?("SERVER_NAME") + size_hash.store("SERVER_NAME", 12) + elsif col.upcase.eql?("REGION_NAME") + size_hash.store("REGION_NAME", 12) + elsif col.upcase.eql?("START_KEY") + size_hash.store("START_KEY", 10) + elsif col.upcase.eql?("END_KEY") + size_hash.store("END_KEY", 10) + elsif col.upcase.eql?("SIZE") + size_hash.store("SIZE", 5) + elsif col.upcase.eql?("REQ") + size_hash.store("REQ", 5) + elsif col.upcase.eql?("LOCALITY") + size_hash.store("LOCALITY", 10) + else + raise "#{col} is not a valid column. Possible values are SERVER_NAME, REGION_NAME, START_KEY, END_KEY, SIZE, REQ, LOCALITY." + end + end + else + raise "#{cols} must be an array of strings. Possible values are SERVER_NAME, REGION_NAME, START_KEY, END_KEY, SIZE, REQ, LOCALITY." + end + admin_instance = admin.instance_variable_get("@admin") conn_instance = admin_instance.getConnection() cluster_status = admin_instance.getClusterStatus() @@ -64,19 +99,58 @@ EOF raise "#{LOCALITY_THRESHOLD} must be between 0 and 1.0, inclusive" unless valid_locality_threshold? value locality_threshold = value end + regions.each do |hregion| hregion_info = hregion.getRegionInfo() server_name = hregion.getServerName() region_load_map = cluster_status.getLoad(server_name).getRegionsLoad() region_load = region_load_map.get(hregion_info.getRegionName()) + # Ignore regions which exceed our locality threshold if accept_region_for_locality? region_load.getDataLocality(), locality_threshold - startKey = Bytes.toString(hregion_info.getStartKey()) - endKey = Bytes.toString(hregion_info.getEndKey()) - region_store_file_size = region_load.getStorefileSizeMB() - region_requests = region_load.getRequestsCount() - results << { "server" => hregion.getServerName().toString(), "name" => hregion_info.getRegionNameAsString(), "startkey" => startKey, "endkey" => endKey, - "size" => region_store_file_size, "requests" => region_requests, "locality" => region_load.getDataLocality() } + result_hash = Hash.new + + if size_hash.key?("SERVER_NAME") + result_hash.store("SERVER_NAME", server_name.toString().strip) + size_hash["SERVER_NAME"] = [size_hash["SERVER_NAME"], server_name.toString().strip.length].max + end + + if size_hash.key?("REGION_NAME") + result_hash.store("REGION_NAME", hregion_info.getRegionNameAsString().strip) + size_hash["REGION_NAME"] = [size_hash["REGION_NAME"], hregion_info.getRegionNameAsString().length].max + end + + if size_hash.key?("START_KEY") + startKey = Bytes.toStringBinary(hregion_info.getStartKey()).strip + result_hash.store("START_KEY", startKey) + size_hash["START_KEY"] = [size_hash["START_KEY"], startKey.length].max + end + + if size_hash.key?("END_KEY") + endKey = Bytes.toStringBinary(hregion_info.getEndKey()).strip + result_hash.store("END_KEY", endKey) + size_hash["END_KEY"] = [size_hash["END_KEY"], endKey.length].max + end + + if size_hash.key?("SIZE") + region_store_file_size = region_load.getStorefileSizeMB().to_s.strip + result_hash.store("SIZE", region_store_file_size) + size_hash["SIZE"] = [size_hash["SIZE"], region_store_file_size.length].max + end + + if size_hash.key?("REQ") + region_requests = region_load.getRequestsCount().to_s.strip + result_hash.store("REQ", region_requests) + size_hash["REQ"] = [size_hash["REQ"], region_requests.length].max + end + + if size_hash.key?("LOCALITY") + locality = region_load.getDataLocality().to_s.strip + result_hash.store("LOCALITY", locality) + size_hash["LOCALITY"] = [size_hash["LOCALITY"], locality.length].max + end + + results << result_hash end end ensure @@ -85,13 +159,25 @@ EOF @end_time = Time.now - printf("%-60s | %-60s | %-15s | %-15s | %-20s | %-20s | %-20s", "SERVER_NAME", "REGION_NAME", "START_KEY", "END_KEY", "SIZE", "REQ", "LOCALITY"); + size_hash.each do | param, length | + printf(" %#{length}s |", param) + end printf("\n") - for result in results - printf("%-60s | %-60s | %-15s | %-15s | %-20s | %-20s | %-20s", result["server"], result["name"], result["startkey"], result["endkey"], result["size"], result["requests"], result['locality']); - printf("\n") + + size_hash.each do | param, length | + str = "-" * length + printf(" %#{length}s |", str) end - printf("%d rows", results.size) + printf("\n") + + results.each do | result | + size_hash.each do | param, length | + printf(" %#{length}s |", result[param]) + end + printf("\n") + end + + printf(" %d rows\n", results.size) end
