diff options
Diffstat (limited to 'PCAP-PIC/hbase/bin/region_status.rb')
| -rw-r--r-- | PCAP-PIC/hbase/bin/region_status.rb | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/PCAP-PIC/hbase/bin/region_status.rb b/PCAP-PIC/hbase/bin/region_status.rb new file mode 100644 index 0000000..abd19dd --- /dev/null +++ b/PCAP-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 |
