HBase之Snapshot


HBase之Snapshot

1.配置项中打开snapshot

<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>

2.创建一个snapshot

$ ./bin/hbase shell
hbase> snapshot 'myTable', 'myTableSnapshot-122112'

3.列出snapshot

$ ./bin/hbase shell
hbase> list_snapshots

4. 删除snapshot

$ ./bin/hbase shell
hbase> delete_snapshot 'myTableSnapshot-122112'

5. 从snapshot 克隆一个表

$ ./bin/hbase shell
hbase> clone_snapshot 'myTableSnapshot-122112', 'myNewTestTable'

6. 恢复一张表

恢复操作需要表离线不可用,恢复操作将让表回到snapshot时的状态,同时改变数据和schema,如果必要的话。
$ ./bin/hbase shell
hbase> disable 'myTable'
hbase> restore_snapshot 'myTableSnapshot-122112'

7.输出到其他集群

$ bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase -mappers 16
与其它集群的导出或导入
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \
    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \
-copy-to hdfs://srv1:50070/hbase \

8. 用来改表名

hbase> disable 'tableName'
hbase> snapshot 'tableName', 'tableSnapshot'
hbase> clone_snapshot 'tableSnapshot', 'newTableName'
hbase> delete_snapshot 'tableSnapshot'
hbase> drop 'tableName'

原理解析

HFile生成之后只会被删除,不会被修改,连追加的修改都不会 Snapshot之所以能在常数时间内完成,是因为它只是一组元数据(MetaData)的集合。Snapshot的操作都不需要复制任何业务数据。 首先我们要理解,HBase的底层存储文件HFile是什么,以及是怎么被生成的、怎么被删除的(或者叫生命周期)。其次就不难理解Snapshot为什么不需要复制业务数据了

Snapshot操作的实现 建立Snapshot 1,Master与RegionServer同步,让他们同时进行MemStore flush 2,记录MetaData,即当前表有哪些region,每个region使用的HFile是哪些 3,“标记”HFile以防被删除 *建立Snapshot的过程不需要让表下线。

恢复Snapshot 根据Snapshot对应的MetaData恢复各个region,该表需要先下线

引用: HBase Snapshot简介