View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.apache.hadoop.hbase.backup.example;
19  
20  import java.io.IOException;
21  
22  import org.apache.hadoop.hbase.classification.InterfaceAudience;
23  import org.apache.hadoop.conf.Configuration;
24  import org.apache.hadoop.conf.Configured;
25  import org.apache.hadoop.hbase.client.ClusterConnection;
26  import org.apache.hadoop.hbase.util.Bytes;
27  import org.apache.hadoop.hbase.zookeeper.ZKUtil;
28  import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
29  import org.apache.zookeeper.KeeperException;
30  
31  /**
32   * Example class for how to use the table archiving coordinated via zookeeper
33   */
34  @InterfaceAudience.Private
35  public class ZKTableArchiveClient extends Configured {
36  
37    /** Configuration key for the archive node. */
38    private static final String ZOOKEEPER_ZNODE_HFILE_ARCHIVE_KEY = "zookeeper.znode.hfile.archive";
39    private ClusterConnection connection;
40  
41    public ZKTableArchiveClient(Configuration conf, ClusterConnection connection) {
42      super(conf);
43      this.connection = connection;
44    }
45  
46    /**
47     * Turn on backups for all HFiles for the given table.
48     * <p>
49     * All deleted hfiles are moved to the archive directory under the table directory, rather than
50     * being deleted.
51     * <p>
52     * If backups are already enabled for this table, does nothing.
53     * <p>
54     * If the table does not exist, the archiving the table's hfiles is still enabled as a future
55     * table with that name may be created shortly.
56     * @param table name of the table to start backing up
57     * @throws IOException if an unexpected exception occurs
58     * @throws KeeperException if zookeeper can't be reached
59     */
60    public void enableHFileBackupAsync(final byte[] table) throws IOException, KeeperException {
61      createHFileArchiveManager().enableHFileBackup(table).stop();
62    }
63  
64    /**
65     * Disable hfile backups for the given table.
66     * <p>
67     * Previously backed up files are still retained (if present).
68     * <p>
69     * Asynchronous operation - some extra HFiles may be retained, in the archive directory after
70     * disable is called, dependent on the latency in zookeeper to the servers.
71     * @param table name of the table stop backing up
72     * @throws IOException if an unexpected exception occurs
73     * @throws KeeperException if zookeeper can't be reached
74     */
75    public void disableHFileBackup(String table) throws IOException, KeeperException {
76      disableHFileBackup(Bytes.toBytes(table));
77    }
78  
79    /**
80     * Disable hfile backups for the given table.
81     * <p>
82     * Previously backed up files are still retained (if present).
83     * <p>
84     * Asynchronous operation - some extra HFiles may be retained, in the archive directory after
85     * disable is called, dependent on the latency in zookeeper to the servers.
86     * @param table name of the table stop backing up
87     * @throws IOException if an unexpected exception occurs
88     * @throws KeeperException if zookeeper can't be reached
89     */
90    public void disableHFileBackup(final byte[] table) throws IOException, KeeperException {
91      createHFileArchiveManager().disableHFileBackup(table).stop();
92    }
93  
94    /**
95     * Disable hfile backups for all tables.
96     * <p>
97     * Previously backed up files are still retained (if present).
98     * <p>
99     * Asynchronous operation - some extra HFiles may be retained, in the archive directory after
100    * disable is called, dependent on the latency in zookeeper to the servers.
101    * @throws IOException if an unexpected exception occurs
102    * @throws KeeperException if zookeeper can't be reached
103    */
104   public void disableHFileBackup() throws IOException, KeeperException {
105     createHFileArchiveManager().disableHFileBackup().stop();
106   }
107 
108   /**
109    * Determine if archiving is enabled (but not necessarily fully propagated) for a table
110    * @param table name of the table to check
111    * @return <tt>true</tt> if it is, <tt>false</tt> otherwise
112    * @throws IOException if a connection to ZooKeeper cannot be established
113    * @throws KeeperException
114    */
115   public boolean getArchivingEnabled(byte[] table) throws IOException, KeeperException {
116     HFileArchiveManager manager = createHFileArchiveManager();
117     try {
118       return manager.isArchivingEnabled(table);
119     } finally {
120       manager.stop();
121     }
122   }
123 
124   /**
125    * Determine if archiving is enabled (but not necessarily fully propagated) for a table
126    * @param table name of the table to check
127    * @return <tt>true</tt> if it is, <tt>false</tt> otherwise
128    * @throws IOException if an unexpected network issue occurs
129    * @throws KeeperException if zookeeper can't be reached
130    */
131   public boolean getArchivingEnabled(String table) throws IOException, KeeperException {
132     return getArchivingEnabled(Bytes.toBytes(table));
133   }
134 
135   /**
136    * @return A new {@link HFileArchiveManager} to manage which tables' hfiles should be archived
137    *         rather than deleted.
138    * @throws KeeperException if we can't reach zookeeper
139    * @throws IOException if an unexpected network issue occurs
140    */
141   private synchronized HFileArchiveManager createHFileArchiveManager() throws KeeperException,
142       IOException {
143     return new HFileArchiveManager(this.connection, this.getConf());
144   }
145 
146   /**
147    * @param conf conf to read for the base archive node
148    * @param zooKeeper zookeeper to used for building the full path
149    * @return get the znode for long-term archival of a table for
150    */
151   public static String getArchiveZNode(Configuration conf, ZooKeeperWatcher zooKeeper) {
152     return ZKUtil.joinZNode(zooKeeper.baseZNode, conf.get(ZOOKEEPER_ZNODE_HFILE_ARCHIVE_KEY,
153       TableHFileArchiveTracker.HFILE_ARCHIVE_ZNODE_PARENT));
154   }
155 }