You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by as...@apache.org on 2017/05/05 18:04:17 UTC

hbase git commit: HBASE-14925 (Addendum) Develop HBase shell command/tool to list table's region info through command line

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 <as...@apache.org>


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 <ka...@gmail.com>
Authored: Fri May 5 23:33:30 2017 +0530
Committer: Ashish Singhi <as...@apache.org>
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