HBase Snapshots 简介

Posted DBA成长之道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase Snapshots 简介相关的知识,希望对你有一定的参考价值。

本文主要翻译 Introduction to Apache HBase Snapshots

https://blog.cloudera.com/blog/2013/03/introduction-to-apache-hbase-snapshots/


什么是快照

快照是一组元数据信息,允许管理员返回到表的先前状态。 快照不是表的副本; 它只是一个文件名列表,不会复制数据。 完整快照还原意味着您将返回到先前的“表状态”,即恢复以前的数据,从而丢失自快照以来所做的任何更改。

操作

  • 拍摄快照:此操作尝试在指定的表上拍摄快照。如果区域在平衡,拆分或合并期间移动,则操作可能会失败。

  • 克隆快照:此操作使用相同的模式创建新表,并在指定的快照中显示相同的数据。此操作的结果是一个新的全功能表,可以在不影响原始表或快照的情况下进行修改。

  • 还原快照:此操作将表架构和数据恢复为快照状态。(注意:此操作会丢弃自拍摄快照以来所做的任何更改。)

  • 删除快照:此操作从系统中删除快照,释放非共享磁盘空间,而不会影响任何克隆或其他快照。

  • 导出快照:此操作将快照数据和元数据复制到另一个群集。该操作仅涉及HDFS,因此与 HMaster 或 RS 没有交互,所以 HBase 群集可以处于停止状态。

零拷贝快照,还原,克隆

快照和 CopyTable / ExportTable 之间的主要区别在于快照操作仅写入元数据。没有涉及大量数据副本。

HBase的主要设计原则之一是,一旦文件被写入,它将永远不会被修改。拥有不可变文件意味着快照只跟踪快照操作时使用的文件,并且在压缩期间,快照负责通知系统不应删除该文件,而应将其归档。

同样的原则适用于克隆或还原操作。由于文件是不可变的,因此创建一个新表,只使用快照引用的文件的“链接”。

导出快照是唯一需要数据副本的操作,因为其他群集没有数据文件。

导出快照 vs 复制/导出表

除了复制/导出作业与快照之间提供的更好的一致性保证之外,

导出快照和复制/导出表之间的主要区别在于 ExportSnapshot 在HDFS级别运行。这意味着主服务器和区域服务器不参与此操作。

因此,在扫描过程中创建的对象数量不会创建不必要的数据高速缓存,不会触发其他GC暂停。

对HBase集群的性能影响源于 DataNode 所经历的额外网络和磁盘工作负载。

HBase Shell

通过检查 hbase-site.xml 文件中 hbase.snapshot.enabled 中的属性是否设置为true,确认已启用快照支持。

# 要获取指定表的快照,请使用该snapshot命令。(不执行文件复制)
hbase> snapshot ‘tableName’, ‘snapshotName’

# 要列出所有快照,请使用该list_snapshot命令。它将显示快照名称,源表以及创建日期和时间。
hbase> list_snapshots
SNAPSHOT TABLE + CREATION TIME
TestSnapshot TestTable (Mon Feb 25 21:13:49 +0000 2013)

# 要删除快照,请使用该delete_snapshot命令。删除快照不会影响克隆表或其他后续快照。
hbase> delete_snapshot 'snapshotName'

# 要从指定的快照(克隆)创建新表,请使用该clone_snapshot命令。不会执行任何数据副本,因此您最终不会使用两倍的空间来存储相同的数据。
hbase> clone_snapshot 'snapshotName', 'newTableName'

# 要使用指定的快照内容替换当前表模式/数据,请使用该restore_snapshot 命令。
# 用快照恢复数据,它需要先禁用表,再进行恢复
hbase> disable 'tableName'
hbase> restore_snapshot 'snapshotName'

# 要将现有快照导出到另一个群集,请使用该ExportSnapshot工具。导出不会影响RegionServers工作负载,它在HDFS级别工作,您必须指定HDFS位置(另一个群集的hbase.rootdir)。
# 该操作要用hbase的账户执行,并且在hdfs当中要有hbase的账户建立的临时目录(hbase.tmp.dir参数控制)
# 采用16个mappers来把一个名为MySnapshot的快照复制到一个名为srv2的集群当中
# DN在拷贝数据的时候需要额外的带宽以及IO负载,ExportSnapshot也针对这个问题设置了参数-bandwidth来限制带宽的使用。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot SnapshotName -copy-to hdfs:///srv2:8082/hbase -mappers 16 -bandwidth 1024

限制

因原文是 2013 年的。不确定限制是否已经处理掉了。所以在这里保留了。后续了解清楚后再来编辑这一段内容。

快照依赖于某些假设,目前有一些工具未与新功能完全集成:

  • 合并快照引用的 region 会导致快照和克隆表上的数据丢失。

  • 用快照还原的处于主备复制状态的主表时将导致两个群集不同步。副本表上未恢复该表。

快照的使用示例

1. 更改表名

因为 HBase 中没有 Rename 命令, 所以更改表名比较复杂。重命名主要通过 HBase 的快照功能。

# 停止表继续插入
hbase shell> disable 'tableName'

# 制作快照
hbase shell> snapshot 'tableName', 'tableSnapshot'

# 克隆快照为新的名字
hbase shell> clone_snapshot 'tableSnapshot', 'newTableName'

# 删除快照
hbase shell> delete_snapshot 'tableSnapshot'

# 删除原来表
hbase shell> drop 'tableName'
2. 恢复表

从用户/应用程序错误中恢复表。

# 制作快照
hbase shell> snapshot 'tableName', 'tableSnapshot'

# 下线表
hbase shell> disable 'tableName'

# 还原快照
hbase shell> restore_snapshot 'tableSnapshot'

# 上线表
hbase shell> enable 'tableName'

3. 表迁移

HBase Snapshot 可以在对 RS 影响很小的情况下创建快照、将快照复制到另一个集群。

由于导出快照在 HDFS 级别运行,因此不会像 CopyTable 那样减慢主 HBase 群集的速度。

# 在源表上创建快照。
# hbase snapshot create -n $SnapshotName -t $TableName
hbase shell> snapshot 'tableName', 'tableSnapshot'

# 将snapshot拷贝到目标集群的HDFS上。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot $SnapshotName -copy-from $SrcSnapshotPath -copy-to $DstSnapshotPath

# 在目标集群恢复snapshot。
hbase shell> restore_snapshot 'tableSnapshot'

参考链接

  • https://blog.cloudera.com/blog/2013/03/introduction-to-apache-hbase-snapshots/

  • https://blog.csdn.net/zfy1355/article/details/47605021

  • https://www.cnblogs.com/cenyuhai/p/3309033.html

以上是关于HBase Snapshots 简介的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop--05---HBase简介

HBase简介

大数据技术之HBaseHBase简介HBase快速入门HBase进阶

大数据技术之HBaseHBase简介HBase快速入门HBase进阶

大数据技术之HBaseHBase简介HBase快速入门HBase进阶

大数据技术之HBaseHBase简介HBase快速入门HBase进阶