summaryrefslogtreecommitdiff
path: root/MSH-PIC/hbase/bin/region_status.rb
diff options
context:
space:
mode:
Diffstat (limited to 'MSH-PIC/hbase/bin/region_status.rb')
-rw-r--r--MSH-PIC/hbase/bin/region_status.rb150
1 files changed, 150 insertions, 0 deletions
diff --git a/MSH-PIC/hbase/bin/region_status.rb b/MSH-PIC/hbase/bin/region_status.rb
new file mode 100644
index 0000000..abd19dd
--- /dev/null
+++ b/MSH-PIC/hbase/bin/region_status.rb
@@ -0,0 +1,150 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# View the current status of all regions on an HBase cluster. This is
+# predominantly used to determined if all the regions in META have been
+# onlined yet on startup.
+#
+# To use this script, run:
+#
+# ${HBASE_HOME}/bin/hbase org.jruby.Main region_status.rb [wait] [--table <table_name>]
+
+require 'optparse'
+
+usage = 'Usage : ./hbase org.jruby.Main region_status.rb [wait]' \
+ '[--table <table_name>]\n'
+OptionParser.new do |o|
+ o.banner = usage
+ o.on('-t', '--table TABLENAME', 'Only process TABLENAME') do |tablename|
+ $tablename = tablename
+ end
+ o.on('-h', '--help', 'Display help message') { puts o; exit }
+ o.parse!
+end
+
+SHOULD_WAIT = ARGV[0] == 'wait'
+if ARGV[0] && !SHOULD_WAIT
+ print usage
+ exit 1
+end
+
+require 'java'
+
+java_import org.apache.hadoop.hbase.HBaseConfiguration
+java_import org.apache.hadoop.hbase.TableName
+java_import org.apache.hadoop.hbase.HConstants
+java_import org.apache.hadoop.hbase.MasterNotRunningException
+java_import org.apache.hadoop.hbase.client.HBaseAdmin
+java_import org.apache.hadoop.hbase.client.Table
+java_import org.apache.hadoop.hbase.client.Scan
+java_import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter
+java_import org.apache.hadoop.hbase.util.Bytes
+java_import org.apache.hadoop.hbase.HRegionInfo
+java_import org.apache.hadoop.hbase.MetaTableAccessor
+java_import org.apache.hadoop.hbase.HTableDescriptor
+java_import org.apache.hadoop.hbase.client.ConnectionFactory
+
+# disable debug logging on this script for clarity
+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.create
+config.set 'fs.defaultFS', config.get(HConstants::HBASE_DIR)
+connection = ConnectionFactory.createConnection(config)
+# wait until the master is running
+admin = nil
+loop do
+ begin
+ admin = connection.getAdmin
+ break
+ rescue MasterNotRunningException => e
+ print 'Waiting for master to start...\n'
+ sleep 1
+ end
+end
+
+meta_count = 0
+server_count = 0
+
+# scan META to see how many regions we should have
+if $tablename.nil?
+ scan = Scan.new
+else
+ tableNameMetaPrefix = $tablename + HConstants::META_ROW_DELIMITER.chr
+ scan = Scan.new(
+ (tableNameMetaPrefix + HConstants::META_ROW_DELIMITER.chr).to_java_bytes
+ )
+end
+scan.setCacheBlocks(false)
+scan.setCaching(10)
+scan.setFilter(FirstKeyOnlyFilter.new)
+INFO = 'info'.to_java_bytes
+REGION_INFO = 'regioninfo'.to_java_bytes
+scan.addColumn INFO, REGION_INFO
+table = nil
+iter = nil
+loop do
+ begin
+ table = connection.getTable(TableName.valueOf('hbase:meta'))
+ scanner = table.getScanner(scan)
+ iter = scanner.iterator
+ break
+ rescue IOException => ioe
+ print "Exception trying to scan META: #{ioe}"
+ sleep 1
+ end
+end
+while iter.hasNext
+ result = iter.next
+ rowid = Bytes.toString(result.getRow)
+ rowidStr = java.lang.String.new(rowid)
+ if !$tablename.nil? && !rowidStr.startsWith(tableNameMetaPrefix)
+ # Gone too far, break
+ break
+ end
+ region = MetaTableAccessor.getHRegionInfo(result)
+ unless region.isOffline
+ # only include regions that should be online
+ meta_count += 1
+ end
+end
+scanner.close
+# If we're trying to see the status of all HBase tables, we need to include the
+# hbase:meta table, that is not included in our scan
+meta_count += 1 if $tablename.nil?
+
+# query the master to see how many regions are on region servers
+$TableName = TableName.valueOf($tablename.to_java_bytes) unless $tablename.nil?
+loop do
+ if $tablename.nil?
+ server_count = admin.getClusterStatus.getRegionsCount
+ else
+ connection = ConnectionFactory.createConnection(config)
+ server_count = MetaTableAccessor.allTableRegions(connection, $TableName).size
+ end
+ print "Region Status: #{server_count} / #{meta_count}\n"
+ if SHOULD_WAIT && server_count < meta_count
+ # continue this loop until server & meta count match
+ sleep 10
+ else
+ break
+ end
+end
+admin.close
+connection.close
+
+exit server_count == meta_count ? 0 : 1