Skip to content

Instantly share code, notes, and snippets.

@dallasmarlow
Created January 6, 2014 22:31
Show Gist options
  • Save dallasmarlow/8291017 to your computer and use it in GitHub Desktop.
Save dallasmarlow/8291017 to your computer and use it in GitHub Desktop.
simple hbase compactor tool
#!/usr/bin/env jruby
require 'socket'
require 'optparse'
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.zookeeper.ZKUtil
import org.apache.hadoop.hbase.util.Bytes
options = {}
OptionParser.new do |option_parser|
option_parser.banner = "Perform hbase major or minor compaction on a table or a given region"
option_parser.on("-t", "--table NAME", "Table name") do |option|
options[:table_name] = option
end
option_parser.on("-r", "--region-name NAME", "Region name") do |option|
options[:region_name] = option
end
option_parser.on("-c", "--compaction-type TYPE", ["major", "minor"], "Compaction type (major|minor)") do |option|
options[:compaction_type] = option.downcase
end
option_parser.on("-m", "--master-only", "Run only on the active master") do |option|
options[:master_only] = option
end
option_parser.on("-l", "--log-level LEVEL", "Hbase/Zookeeper log level") do |option|
options[:log_level] = option
end
option_parser.on_tail("-h", "--help") do |option|
abort option_parser.help
end
end.parse!
# validate compaction target
compaction_target = options[:region_name] || options[:table_name]
unless compaction_target
abort "Usage: #{__FILE__} --help"
end
# adjust log level if requested
if options[:log_level]
log_level = org.apache.log4j.Level.const_get options[:log_level].upcase
['org.apache.zookeeper', 'org.apache.hadoop.hbase'].each do |logger|
org.apache.log4j.Logger.getLogger(logger).setLevel log_level
end
end
hbase_config = HBaseConfiguration.create
admin_client = HBaseAdmin.new hbase_config
if admin_client.isMasterRunning
# enforce the `--master-only` option if set
if options[:master_only]
zookeeper_watcher = admin_client.connection.getZooKeeperWatcher
hbase_master_znode = Bytes.toString ZKUtil.getData zookeeper_watcher, zookeeper_watcher.masterAddressZNode
unless hbase_master_znode.include? Socket.gethostname
abort "Current machine is not the active hbase master, exiting"
end
end
# query for the current compaction state and take action if appropriate
compaction_state = admin_client.getCompactionState compaction_target
if compaction_state.name == "NONE"
case options[:compaction_type]
when "major"
admin_client.majorCompact compaction_target
else # default to minor
admin_client.compact compaction_target
end
puts "Compaction request submitted"
else
abort "Hbase table or region is already undergoing a compaction, state: " + compaction_state.name
end
else
abort "Hbase cluster does not have an active master running, aborting"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment