0 引言
快照即是对某一时刻数据存储状态的保留,HBase中快照应用场景非常广泛,也是其核心概念之一。本文介绍了HBase的快照表的基本概念,分析了HBase各类数据备份的优缺点,研究了HBase快照的基本原理,并对HBase快照的基本操作进行了实战演练。通过本文你可以学到以下知识:
- 什么是快照
- 快照的作用、优势及基本原理
- 快照的主要应用场景
- 快照的基本操作
1 什么是快照
Hbase的快照就是一分元数据的集合。SnapShot的实现不涉及到表的实际数据拷贝,仅仅拷贝一些元数据,如组成表的region信息,表的描述信息,表对应的HFile的文件引用等信息。快照可以在线完成也可以离线完成,可以利用快照完成表的备份。
2 快照与其他备份方法对比分析
备份方法 | 实现方法 | 优点 | 缺点 |
CopyTable |
以表级别进行迁移,其本质也是使用MapReduce的方式进行数据的同步,它是利用MapReduce去scan源表数据,然后把scan出来的数据写到目标集群,从而实现数据的迁移和备份。 |
(1)在线备份(热备份) (2)本地及集群间备份 |
需要通过scan数据,对于很大的表,如果这个表本身又读写比较频繁的情况下,会对性能造成比较大的影响,并且效率比较低。 |
Export/Import | 调用mr复制备份表。将HBase表的数据转换成Sequence File并dump到hdfs,也涉及scan表数据。 | (1)在线备份(热备份) (2)适合本地备份 |
对RegionSever有直接影响,只能是同一集群之间的拷贝比较方便 |
Distinct | 使用MapReduce实现文件分发,把文件和目录的列表当做map任务的输入,每个任务完成部分文件的拷贝和传输工作。在目标集群再使用bulkload的方式导入就实现了数据的迁移。 执行完distcp命令后,需要执行hbase hbck -repairHoles修复HBase表元数据。 |
(1)适合冷备份。适合备份历史数据表(数据不会被修改的情况) (2)适合集群间的拷贝 |
离线备份,需要关闭表,实际环境中无法接受 |
SnapShort | 不拷贝数据,直接克隆一张表,HDFS层面的操作,HMaster和域服务器的操作无关,无扫描过程,无缓存创建 | (1)对RegionSever产生影响小。 (2)不同集群之间也可以拷贝,不会对服务器产生直接影响。 (3)本地和集群间备份 |
比较推荐的方式 |
3 快照的原理
离线方式是disabletable,由HBase Master遍历HDFS中的table metadata和hfiles,建立引用。
在线方式是enabletablesnapshot的过程类似于两阶段提交,prepare和commit阶段,HMaster收到snapshot命令后,作为coordinator,从meta region中取出表的region和对应的region server的信息,这些region server就作为第二阶段提交的participant,prepare阶段对region server本地表的region做快照存入HDFS的临时目录,commit阶段把HMaster把临时目录改成正确的目录。在此期间,HMaster和region server的数据共享通过ZK来完成。
4 快照主要应用场景
(1)增量备份,通常情况下,对重要的业务数据,建议至少每天执行一次snapshot来保存数据的快照记录,并且定期清理过期快照,这样如果业务发生重要错误需要回滚的话是可以回滚到之前的一个快照点的。
(2)从用户或者应用异常中还原;从一个已知的安全状态恢复/还原
(4)查看之前的快照并有选择性的合并不同写入产品环境
(5)如果要对集群做重大的升级的话,建议升级前对重要的表执行一次snapshot,一旦升级有任何异常可以快速回滚到升级前。
(6)数据迁移,生成快照,导入到其他集群进行操作。因为导出的快是HDFS级别,所以不会像复制表那样降低HBase主集群的效率。机房在线迁移,通常情况是数据在A机房,因为A机房机位不够或者机架不够需要将整个集群迁移到另一个容量更大的B集群,而且在迁移过程中不能停服。基本迁移思路是先使用snapshot在B集群恢复出一个全量数据,再使用replication技术增量复制A集群的更新数据,等待两个集群数据一致之后将客户端请求重定向到B机房。
(7)应用测试,构建测试环境:通过快照模拟生产环境下结构或应用发生的变化,测试完成即可丢弃
(8)使用snapshot将表数据导出到HDFS,再使用Hive\Spark等进行离线OLAP分析,比如审计报表、月度报表等
5 快照的相关操作
(1) 在Hbase的配置文件hbase-site.xml中配置快照
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
(2) 在Hbase shell中进行备份表
备份 test_dd表
hbase(main):004:0> snapshot 'test_dd','test_dd-20200311'
与快照相关的元数据会保存在hbase.rootdir参数所指定的hbase根目录下的/hbase_rootdir/.hbase-snapshot/目录中。
进入hbase的conf文件目下,查找hbase-site.xml文件中hbase.rootdir配置
可以看出目录的配置是在/apps/hbase/data目录下。利用hdfs的命令查看
[root@bigdata3 ~]# hadoop fs -ls /apps/hbase/data
进入 .hbase-snapshot目录中继续查看
[root@bigdata3 ~]# hadoop fs -ls /apps/hbase/data/.hbase-snapshot
继续查看:
[root@bigdata3 ~]# hadoop fs -ls /apps/hbase/data/.hbase-snapshot/test_dd-20200311
可以看到该目录下有两个文件,一个记录快照信息,一个记录快照表的元数据信息
(3)查看快照
查看快照:list_snapshots
hbase(main):004:0> list_snapshots
查看后可以看到具体快照名称、源表、以及创建日期和时间
(4)克隆表
利用快照可以迅速的克隆一张新表,并且新表中的数据与创建快照时表中的数据一致,针对克隆表的修改不会影响快照及原始表。
命令:clone_snapshot '快照表','新表名'
hbase(main):005:0> clone_snapshot 'test_dd-20200311','test_dd-20200311-clone'
利用list命令查看克隆成功:
验证:统计克隆表和原始表记录数,看是否有数据丢失
统计原表:
su - hbase
[hbase@bigdata3 ~]$ hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'test_dd'
原表统计数据量为:10429517
克隆表统计:
[hbase@bigdata3 ~]$ hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'test_dd-20200311-clone'
可以看到原表与克隆表的记录一致。
(5)利用快照恢复表
快照可以将表恢复到快照创建时的状态
恢复时需要先将表disable掉。
为了便于读者阅读方便这里创建一张student表,并对该表做快照
student最开始表如下:
快照表如下:
现在对这张表插入2条数据:
hbase(main):005:0> put 'student','1003','infor:sex','male'
0 row(s) in 0.1010 seconds
hbase(main):006:0> put 'student','1003','infor:name','guozixuezhang@xiaoyanjing'
0 row(s) in 0.0080 seconds
查看该表:
现将此刻的表恢复到最初状态,步骤如下:
1)禁止该表
hbase(main):008:0> disable 'student'
0 row(s) in 2.6490 seconds
2)使用student的快照表将该表恢复到快照时的状态
hbase(main):011:0> restore_snapshot 'studentsnapshot'
0 row(s) in 0.9910 seconds
3)enable原始表
hbase(main):012:0> enable 'student'
0 row(s) in 2.3430 seconds
4)查看原始表
hbase(main):002:0> scan 'student'
可以看到表已经恢复到快照时的状态,具体见如下图
(5) 快照操作-导出快照到另一个集群
此时需要在hbase的bin目录下执行而不是在hbase shell中执行
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot MySnapshot -copy-from hdfs://srv1:port/hbase \
-copy-to hdfs://srv2:port/hbase -mappers 16 -bandwidth 1024\
注意:使用ExportSnapshot命令可以将A集群的快照数据迁移到B集群,ExportSnapshot是HDFS层面的操作,会使用MR进行数据的并行迁移,因此需要在开启MR的机器上进行迁移。HMaster和HRegionServer并不参与这个过程,因此不会带来额外的内存开销以及GC开销。唯一的影响是DataNode在拷贝数据的时候需要额外的带宽以及IO负载,ExportSnapshot也针对这个问题设置了参数-bandwidth来限制带宽的使用。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot studentsnapshot -copy-to hdfs://bigdata-3.jx.com:8020/apps/hbase/data -overwrite -mappers 16 -bandwidth 1024
(6)快照的删除操作
先查看现有的快照
可以看到有两张快照
删除快照
hbase(main):004:0> delete_snapshot 'test_dd-20200311'
0 row(s) in 0.0220 seconds
再次查看,可以看到只有一个快照。
references:
http://hbasefly.com/2017/09/17/hbase-snapshot/
Introduction to Apache HBase Snapshots:http://blog.cloudera.com/blog/2013/03/introduction-to-apache-hbase-snapshots/
Introduction to Apache HBase Snapshots, Part 2: Deeper Dive:http://blog.cloudera.com/blog/2013/06/introduction-to-apache-hbase-snapshots-part-2-deeper-dive/