HBase中的快照技术-原理和实践

这都是我自己的随笔,有错误请指正.

用法

在hbase shell下执行

创建  snapshot 'tablename','snapshot_name'

删除  delete_snapshot 'snapshot_name'

克隆  clone_snapshot 'snapshot_name','new_tablename'

列出  list_snapshots

替换  restore_snapshot 'snapshot_name'     原表还原到快照(大概

导出(linux的shell下,没用过)  

      hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snapshot_name -copy-to hdfs:///ip:端口/hbase

有啥用-------------英文版

  • 从用户/应用程序错误中恢复
  • 从已知的安全状态恢复/恢复。
  • 查看以前的快照并有选择地将差异合并到生产中。
  • 在主要应用程序升级或更改之前保存快照。
  • 在特定时间审核和/或报告数据视图
  • 捕获每月数据以实现合规性。
  • 运行结束日/月/季度报告。
  • 应用测试
  • 测试模式或应用程序对快照中生成的数据类似的更改,然后将其丢弃。例如:拍摄快照,从快照内容(架构和数据)创建新表,并通过更改架构,添加和删除行等来操作新表。(原始表,快照和新表保持相互独立。)
  • 卸货工作
  • 拍摄快照,将其导出到另一个群集,然后运行MapReduce作业。由于导出快照在HDFS级别运行,因此您不会像CopyTable那样减慢主HBase群集的速度。

可能的问题

创建:在平衡,拆分(split)或合并(compaction)期间,可能失败.同一时间之内给一张表快照(A表快照中不能给A快照)

克隆:克隆得到的新表和原表可以说是两种表,互不影响,但是克隆表占用的空间很小(相比较原表)

删除:好像没遇到啥问题

导出+替换:(TODO)

 

官方的话

 HBase 从0.95开始引入了Snapshot,可以对table进行Snapshot,也可以Restore到Snapshot。Snapshot可以在线做,也可以离线做。Snapshot的实现不涉及到table实际数据的拷贝,仅仅拷贝一些元数据,比如组成table的region info,表的descriptor,还有表对应的HFile的文件的引用。

存储原理

所以先直接看下文件夹结构,hdfs上的hbase

版本不同可能文件结构不同(应该也差不了太大)

/hbase 里面有以下三个

/.snapshot

n+1个文件夹1个 /.tmp 和n个 /snapshot_name .tmp中的文件是快照过程中生成的,最后是没有的

/archive       引用文件,表描述什么的

引用文件是本地的之外,其它文件则基本上是 export 时,来自其它集群的真实数据文件,这也是Snapshot 相关操作中唯一涉及到真实数据文件拷贝的操作。

/data            放物理表

再后面就要看看源码了,

参考地址-------看起来很美---------这个才是详细

1) Snapshot 具体是什么?它所包含文件的具体信息是什么?

Answer:Snapshot 其实是一系列文件的组合,这些文件中重要的有.snapshotinfo、.tableinfo.[xxxxxxxxxx] 、.regioninfo、 data.manifest,他们包含了对 table、region、store file 等的具体描述元信息,通过对 Snapshot 里的文件做相应的解析,可以还原备份前的 table、region、family 等信息,同时能够找到存储有实际数据信息的 store file 文件,而由于 HBase 在删除文件时,并不会真正的删除文件,而是将文件转移到 archive 目录,所以 Snapshot 始终能保证在任何时候都能还原数据。

2) Take、Clone、Restore、Delete、Export 操作的具体实现原理。

Answer:究其根本,这一系列操作其实就是对 table 以及其下面的所有数据做一个备份与还原等操作,而 Take、Clone、Restore、Delete 操作本身并不涉及到 store file 文件本身的操作,Export 因为涉及到跨集群,所以需要将数据拷贝到其它集群,而由于 HBase 基于 Hadoop 之上,文件系统基于 HDFS,而 Hadoop 实现了跨集群拷贝文件,以及其它譬如集群间通信等方法,这让 Snapshot 的这一系列操作实现变得不那么太关注底层的实现,所以相对而言其实现原理是相对容易理解的。

3) 目录能改变吗?

Answer:不能!即便是 Export 操作,也只能指定其它集群的 HBase 目录位置,不能改变其内在结构。

从程序代码上讲,Snapshot 相关操作的涉及到的内部目录名称都是使用类里面的常量保存,比如

HConstants.HFILE_ARCHIVE_DIRECTORY = "archive"、HConstants.SNAPSHOT_DIR_NAME = ".hbase-snapshot" 等,所以除了改变源码,否则是没办法改变其内部目录结构的。当然,改源码使其目录结构改变是及其不理智的。

其实在做 Snapshot 分析的主要原因之一在于希望能解释 Export 为什么会将数据发送到 archive 目录,而不是直接放在 data 目录下,就这个问题来分析一下为什么不能通过改源码来改变其目录结构。

在 data 目录下的 store file 都是正在使用的,Export 只是传输过来,还没确定是否要使用啊。另外如果改成其它名称,那也没必要啊。

 

 

 

 

 

快照源码解释------清晰+详细

 

 

总的来说

快照就是一个表结构的备份,然后可以快速还原到快照时的状态,比copy什么的备份快的多

然后原理实际上就是根据hbase的文件结构来的,快照克隆出来的表很小是因为他是链接到原表的,然后原表删除快照依然有用,

因为删除表,archive目录还是有数据,能多久就看hbase啥时候去自动删了.

所以快照也就做一个容灾的备份

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值