From f2eb445325157ec059649ca590ef7bd96b915e66 Mon Sep 17 00:00:00 2001 From: Sean Busbey Date: Sun, 28 Sep 2014 00:30:30 -0500 Subject: [PATCH] HBASE-12113. Backport HBASE-5525 Truncate and preserve region boundaries option. (Kevin Odell) --- src/main/ruby/hbase/admin.rb | 19 +++++++++++ src/main/ruby/shell.rb | 1 + src/main/ruby/shell/commands/truncate_preserve.rb | 38 +++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/main/ruby/shell/commands/truncate_preserve.rb diff --git a/src/main/ruby/hbase/admin.rb b/src/main/ruby/hbase/admin.rb index df2c69d..266f1ff 100644 --- a/src/main/ruby/hbase/admin.rb +++ b/src/main/ruby/hbase/admin.rb @@ -21,6 +21,7 @@ include Java java_import org.apache.hadoop.hbase.util.Pair java_import org.apache.hadoop.hbase.util.RegionSplitter +java_import org.apache.hadoop.hbase.util.Bytes java_import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos::SnapshotDescription # Wrapper for org.apache.hadoop.hbase.client.HBaseAdmin @@ -325,6 +326,24 @@ module Hbase @admin.createTable(table_description) end + #---------------------------------------------------------------------------------------------- + # Truncates table while maintaing region boundaries (deletes all records by recreating the table) + def truncate_preserve(table_name, conf = @conf) + h_table = org.apache.hadoop.hbase.client.HTable.new(conf, table_name) + splits = h_table.getRegionLocations().keys().map{|i| Bytes.toString(i.getStartKey)}.delete_if{|k| k == ""}.to_java :String + splits = org.apache.hadoop.hbase.util.Bytes.toByteArrays(splits) + table_description = h_table.getTableDescriptor() + yield 'Disabling table...' if block_given? + disable(table_name) + + yield 'Dropping table...' if block_given? + drop(table_name) + + yield 'Creating table with region boundaries...' if block_given? + @admin.createTable(table_description, splits) + end + + #---------------------------------------------------------------------------------------------- # Check the status of alter command (number of regions reopened) def alter_status(table_name) # Table name should be a string diff --git a/src/main/ruby/shell.rb b/src/main/ruby/shell.rb index 1330b7e..29b08f6 100644 --- a/src/main/ruby/shell.rb +++ b/src/main/ruby/shell.rb @@ -251,6 +251,7 @@ Shell.load_command_group( put scan truncate + truncate_preserve ] ) diff --git a/src/main/ruby/shell/commands/truncate_preserve.rb b/src/main/ruby/shell/commands/truncate_preserve.rb new file mode 100644 index 0000000..918b232 --- /dev/null +++ b/src/main/ruby/shell/commands/truncate_preserve.rb @@ -0,0 +1,38 @@ +# +# +# 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. +# + +module Shell + module Commands + class TruncatePreserve < Command + def help + return <<-EOF + Disables, drops and recreates the specified table while still maintaing the previous region boundaries. +EOF + end + + def command(table) + format_simple_command do + puts "Truncating '#{table}' table (it may take a while):" + admin.truncate_preserve(table) { |log| puts " - #{log}" } + end + end + + end + end +end -- 1.7.10.2 (Apple Git-33)