You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2019/08/01 01:52:26 UTC
[hbase] branch branch-1.4 updated: HBASE-22735 list_regions show
basic info for region currently in transition with error handling
This is an automated email from the ASF dual-hosted git repository.
apurtell pushed a commit to branch branch-1.4
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-1.4 by this push:
new ac3bc22 HBASE-22735 list_regions show basic info for region currently in transition with error handling
ac3bc22 is described below
commit ac3bc22d1198c9b1203527e2df255a1c85f4e138
Author: Viraj Jasani <vi...@gmail.com>
AuthorDate: Mon Jul 29 00:29:59 2019 +0530
HBASE-22735 list_regions show basic info for region currently in transition with error handling
Signed-off-by: Andrew Purtell <ap...@apache.org>
Signed-off-by: Michael Stack <st...@apache.org>
---
.../src/main/ruby/shell/commands/list_regions.rb | 189 +++++++++++----------
1 file changed, 103 insertions(+), 86 deletions(-)
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 f2d4b41..5ad6f1a 100644
--- a/hbase-shell/src/main/ruby/shell/commands/list_regions.rb
+++ b/hbase-shell/src/main/ruby/shell/commands/list_regions.rb
@@ -21,15 +21,13 @@ module Shell
module Commands
class ListRegions < Command
def help
-
- return<<EOF
+ 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'
@@ -37,39 +35,37 @@ module Shell
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
+ nil
end
-
def command(table_name, options = nil, cols = nil)
if options.nil?
options = {}
- elsif not options.is_a? Hash
+ elsif !options.is_a? Hash
# When options isn't a hash, assume it's the server name
# and create the hash internally
- options = {SERVER_NAME => options}
+ options = { SERVER_NAME => options }
end
-
- size_hash = Hash.new
+ raise "Table #{table_name} must be enabled." unless admin.enabled?(table_name)
+ size_hash = {}
if cols.nil?
- size_hash = { "SERVER_NAME" => 12, "REGION_NAME" => 12, "START_KEY" => 10, "END_KEY" => 10, "SIZE" => 5, "REQ" => 5, "LOCALITY" => 10 }
+ 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)
+ if col.casecmp('SERVER_NAME').zero?
+ size_hash.store('SERVER_NAME', 12)
+ elsif col.casecmp('REGION_NAME').zero?
+ size_hash.store('REGION_NAME', 12)
+ elsif col.casecmp('START_KEY').zero?
+ size_hash.store('START_KEY', 10)
+ elsif col.casecmp('END_KEY').zero?
+ size_hash.store('END_KEY', 10)
+ elsif col.casecmp('SIZE').zero?
+ size_hash.store('SIZE', 5)
+ elsif col.casecmp('REQ').zero?
+ size_hash.store('REQ', 5)
+ elsif col.casecmp('LOCALITY').zero?
+ 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
@@ -77,22 +73,20 @@ EOF
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()
+ admin_instance = admin.instance_variable_get('@admin')
+ conn_instance = admin_instance.getConnection
+ cluster_status = admin_instance.getClusterStatus
hregion_locator_instance = conn_instance.getRegionLocator(TableName.valueOf(table_name))
- hregion_locator_list = hregion_locator_instance.getAllRegionLocations().to_a
- results = Array.new
+ hregion_locator_list = hregion_locator_instance.getAllRegionLocations.to_a
+ results = []
desired_server_name = options[SERVER_NAME]
-
begin
# Filter out region servers which we don't want, default to all RS
regions = get_regions_for_table_and_server(table_name, conn_instance, desired_server_name)
# A locality threshold of "1.0" would be all regions (cannot have greater than 1 locality)
# Regions which have a `dataLocality` less-than-or-equal to this value are accepted
locality_threshold = 1.0
- if options.has_key? LOCALITY_THRESHOLD
+ if options.key? LOCALITY_THRESHOLD
value = options[LOCALITY_THRESHOLD]
# Value validation. Must be a Float, and must be between [0, 1.0]
raise "#{LOCALITY_THRESHOLD} must be a float value" unless value.is_a? Float
@@ -101,88 +95,111 @@ EOF
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
- 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
+ hregion_info = hregion.getRegionInfo
+ server_name = hregion.getServerName
+ server_load = cluster_status.getLoad(server_name)
+ if server_load.nil?
+ region_load_map = java.util.HashMap.new
+ else
+ region_load_map = server_load.getRegionsLoad
+ end
+ region_name = hregion_info.getRegionNameAsString
+ region_load = region_load_map.get(hregion_info.getRegionName)
- 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 region_load.nil?
+ puts "Can not find all details for region: " \
+ "#{region_name.strip} ," \
+ " it may be disabled or in transition\n"
+ else
+ # Ignore regions which exceed our locality threshold
+ next unless accept_region_for_locality? region_load.getDataLocality,
+ locality_threshold
+ end
+ result_hash = {}
- 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?('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?("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?('REGION_NAME')
+ result_hash.store('REGION_NAME', region_name.strip)
+ size_hash['REGION_NAME'] = [size_hash['REGION_NAME'], region_name.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?('START_KEY')
+ start_key = Bytes.toStringBinary(hregion_info.getStartKey).strip
+ result_hash.store('START_KEY', start_key)
+ size_hash['START_KEY'] = [size_hash['START_KEY'], start_key.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
+ if size_hash.key?('END_KEY')
+ end_key = Bytes.toStringBinary(hregion_info.getEndKey).strip
+ result_hash.store('END_KEY', end_key)
+ size_hash['END_KEY'] = [size_hash['END_KEY'], end_key.length].max
+ end
+
+ if size_hash.key?('SIZE')
+ if region_load.nil?
+ region_store_file_size = ''
+ else
+ region_store_file_size = region_load.getStorefileSizeMB.to_s.strip
end
+ 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?("LOCALITY")
- locality = region_load.getDataLocality().to_s.strip
- result_hash.store("LOCALITY", locality)
- size_hash["LOCALITY"] = [size_hash["LOCALITY"], locality.length].max
+ if size_hash.key?('REQ')
+ if region_load.nil?
+ region_requests = ''
+ else
+ region_requests = region_load.getRequestsCount.to_s.strip
end
+ result_hash.store('REQ', region_requests)
+ size_hash['REQ'] = [size_hash['REQ'], region_requests.length].max
+ end
- results << result_hash
+ if size_hash.key?('LOCALITY')
+ if region_load.nil?
+ locality = ''
+ else
+ locality = region_load.getDataLocality.to_s.strip
+ end
+ result_hash.store('LOCALITY', locality)
+ size_hash['LOCALITY'] = [size_hash['LOCALITY'], locality.length].max
end
+
+ results << result_hash
end
ensure
- hregion_locator_instance.close()
+ hregion_locator_instance.close
end
@end_time = Time.now
- size_hash.each do | param, length |
+ size_hash.each do |param, length|
printf(" %#{length}s |", param)
end
printf("\n")
- size_hash.each do | param, length |
- str = "-" * length
+ size_hash.each_value do |length|
+ str = '-' * length
printf(" %#{length}s |", str)
end
printf("\n")
- results.each do | result |
- size_hash.each do | param, length |
+ 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
def valid_locality_threshold?(value)
- value >= 0 and value <= 1.0
+ value >= 0 && value <= 1.0
end
def get_regions_for_table_and_server(table_name, conn, server_name)
@@ -191,16 +208,16 @@ EOF
def get_regions_for_server(regions_for_table, server_name)
regions_for_table.select do |hregion|
- accept_server_name? server_name, hregion.getServerName().toString()
+ accept_server_name? server_name, hregion.getServerName.toString
end
end
def get_regions_for_table(table_name, conn)
- conn.getRegionLocator(TableName.valueOf(table_name)).getAllRegionLocations().to_a
+ conn.getRegionLocator(TableName.valueOf(table_name)).getAllRegionLocations.to_a
end
def accept_server_name?(desired_server_name, actual_server_name)
- desired_server_name.nil? or actual_server_name.start_with? desired_server_name
+ desired_server_name.nil? || actual_server_name.start_with?(desired_server_name)
end
def accept_region_for_locality?(actual_locality, locality_threshold)
@@ -208,4 +225,4 @@ EOF
end
end
end
-end
+end
\ No newline at end of file