From 8ee4464ef9139c8f04f1789fcdf9447cc85569ac Mon Sep 17 00:00:00 2001 From: Elliott Clark Date: Wed, 21 Jan 2015 13:49:14 -0800 Subject: [PATCH] HBASE-12892 Add a class to allow taking a snapshot from the command line --- bin/hbase | 3 + .../hadoop/hbase/snapshot/CreateSnapshot.java | 86 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/CreateSnapshot.java diff --git a/bin/hbase b/bin/hbase index 31fd2329007..87138377dce 100755 --- a/bin/hbase +++ b/bin/hbase @@ -83,6 +83,7 @@ if [ $# = 0 ]; then echo "Some commands take arguments. Pass no args or -h for usage." echo " shell Run the HBase shell" echo " hbck Run the hbase 'fsck' tool" + echo " snapshot Create a new snapshot of a table" echo " wal Write-ahead-log analyzer" echo " hfile Store file analyzer" echo " zkcli Run the ZooKeeper shell" @@ -302,6 +303,8 @@ elif [ "$COMMAND" = "zkcli" ] ; then CLASS="org.apache.hadoop.hbase.zookeeper.ZooKeeperMainServer" elif [ "$COMMAND" = "upgrade" ] ; then CLASS="org.apache.hadoop.hbase.migration.UpgradeTo96" +elif [ "$COMMAND" = "snapshot" ] ; then + CLASS="org.apache.hadoop.hbase.snapshot.CreateSnapshot" elif [ "$COMMAND" = "master" ] ; then CLASS='org.apache.hadoop.hbase.master.HMaster' if [ "$1" != "stop" ] && [ "$1" != "clear" ] ; then diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/CreateSnapshot.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/CreateSnapshot.java new file mode 100644 index 00000000000..06b601735da --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/CreateSnapshot.java @@ -0,0 +1,86 @@ +/** + * + * 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. + */ +package org.apache.hadoop.hbase.snapshot; + +import org.apache.commons.cli.CommandLine; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.client.ConnectionFactory; +import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; +import org.apache.hadoop.hbase.util.AbstractHBaseTool; +import java.util.Arrays; + + +/** + * This is a command line class that will snapshot a given table. + */ +public class CreateSnapshot extends AbstractHBaseTool { + private String tableName = null; + private String snapshotName = null; + private String snapshotType = null; + + public static void main(String[] args) { + new CreateSnapshot().doStaticMain(args); + } + + @Override + protected void addOptions() { + this.addRequiredOptWithArg("t", "table", "The name of the table"); + this.addRequiredOptWithArg("n", "name", "The name of the created snapshot"); + this.addOptWithArg("s", "snapshot_type", + "Snapshot Type. FLUSH is default. Posible values are " + + Arrays.toString(HBaseProtos.SnapshotDescription.Type.values())); + } + + @Override + protected void processOptions(CommandLine cmd) { + this.tableName = cmd.getOptionValue('t'); + this.snapshotName = cmd.getOptionValue('n'); + this.snapshotType = cmd.getOptionValue('s'); + + } + + @Override + protected int doWork() throws Exception { + Connection connection = null; + Admin admin = null; + try { + connection = ConnectionFactory.createConnection(getConf()); + admin = connection.getAdmin(); + HBaseProtos.SnapshotDescription.Type type = HBaseProtos.SnapshotDescription.Type.FLUSH; + if (snapshotType != null) { + type = HBaseProtos.SnapshotDescription.Type.valueOf(snapshotName.toUpperCase()); + } + + admin.snapshot(snapshotName, TableName.valueOf(tableName), type); + } catch (Exception e) { + return -1; + } finally { + if (admin != null) { + admin.close(); + } + if (connection != null) { + connection.close(); + } + } + return 0; + } + +}