HBase数据备份与还原

HBase是一个基于LSM树(log-structured merge-tree)的分布式数据存储系统,它使用复杂的内部机制确保数据准确性、一致性、多版本等。

如何获取数十个region server在HDFS和内存中的存储的众多HFile文件、WALs(Write-Ahead-Logs)的一致的数据备份? HBase提供了多种方式:(顺序:最小的破坏性 --> 最具破坏性)

  • Snapshots
  • Replication
  • Export
  • CopyTable
  • HTable API
  • Offline backup of HDFS data

这几种备份方法的比较如下表所示:

下面我们对常用的几种方式加以说明。

Snapshots(快照)

HBase快照功能丰富,有很多特征,并且创建时不需要关闭集群。

通过在HBase shell中运行如下命令来创建一个表的快照:

hbase(main):001:0>  snapshot  'myTable', 'MySnapShot'  

想要恢复数据只需要执行在shell中执行如下命令:

hbase(main):002:0>  disable 'myTable'  
hbase(main):003:0>  restore_snapshot 'MySnapShot'  
hbase(main):004:0>  enable 'myTable'  

快照实现原理如下图所示:

恢复快照需要对表进行离线操作。一旦恢复快照,那任何在快照时刻之后做的增加/更新数据都会丢失。快照是你的表在某一个时刻的完整图像,目前没有增量快照功能可用。

HBase复制(Replication)

HBase复制是另外一个负载较轻的备份工具。

复制有三种模式:主->从(master->slave)、主<->主(master<->master)和循环(cyclic)

复制是一个强大的,容错的过程。它提供了“最终一致性”,意味着在任何时刻,最近对一个表的编辑可能无法应用到该表的所有副本,但是最终能够确保一致。

集群复制架构图如下所示:

导出(Export)与导入(Import)

HBase的导出工具是一个内置的实用功能,它使数据很容易从HBase表导入为HDFS目录下的SequenceFiles文件。

它创造了一个MapReduce任务,通过一系列HBase API来调用集群,获取指定表格的每一行数据,并且将数据写入指定的HDFS目录中。

这个工具对集群来讲是性能密集的,因为它使用了MapReduce和HBase 客户端API。但是它的功能丰富,支持制定版本或日期范围,支持数据的筛选,从而使增量备份可用。

导出表的命令:

hbase org.apache.hadoop.hbase.mapreduce.Export   

恢复表的命令(导入时必须先创建表结构):

hbase org.apache.hadoop.hbase.mapreduce.Import   

一旦表导出了,我们就可以复制生成的数据文件到想存储的任何地方(比如异地/离线集群存储)。

拷贝表(CopyTable)

和Export功能类似,拷贝表也使用HBase API创建了一个MapReduce任务,以便从源表读取数据。不同的地方是拷贝表的输出是HBase中的另一个表,这个表可以在本地集群,也可以在远程集群。

例:拷贝名为test的表到集群中的另外一个表testCopy。

hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=testCopy test

注:textCopy表必须先创建。

注意,这里有一个明显的性能开销,它使用独立的“put”操作来逐行的写入数据到目的表。如果表非常大,拷贝表将会导致目标region server上的memstore被填满,会引起flush操作并最终导致合并操作的产生,会有垃圾收集操作等等。

此外,必须考虑到在HBase上运行MapReduce任务所带来的性能影响。对于大型的数据集,这种方法的效果可能不太理想。


《PySpark原理深入与编程实战》