本文分享自华为云社区《看看HBase Snapshot中表的文件是怎样变化的》,原文作者:Lettle whale 。

简介

HBase的Snapshot功能可以在不复制数据的情况下,快速克隆一张表,完成一次数据备份。通过Snapshot,我们在做应用升级之前生成一个快照,后续如果遇到问题可以快速回滚到快照点。Snapshot过程不涉及底层数据文件的拷贝和移动,只是对文件做了记录,保存了一份原始文件的指针记录,所以非常迅速,掌握Snapshot可以帮助我们很好的完成HBase数据备份和数据迁移的工作。

快照文件

● 对一个表“mytable“,执行快照命令

hbase(main):078:0> snapshot 'mytable','snapshot-test'
0 row(s) in 1.1110 seconds

● 在HDFS目录下.hbase-snapshot中会生成一个生成一个以快照名字“snapshot-test”命名的snapshot文件夹

(本文HDFS中hbase的根目录为/d-hbase)

./hdfs dfs -ls /d-hbase/.hbase-snapshot
Found 2 items
drwxr-xr-x   - root supergroup    /d-hbase/.hbase-snapshot/.tmp
drwxr-xr-x   - root supergroup    /d-hbase/.hbase-snapshot/snapshot-test

● Region的所有元数据及HFile信息会记录到snapshot文件夹中,文件夹中有2个文件,其中.snapshotinfo为snapshot基本信息,包含表名称和snapshot名,data.manifest为snapshot执行后生成的元数据信息,里面包含了表的schema信息,region信息,以及HFile指针

./hdfs dfs -ls /d-hbase/.hbase-snapshot/snapshot-test
Found 2 items
-rw-r--r--   1 root supergroup    /d-hbase/.hbase-snapshot/snapshot-test/.snapshotinfo
-rw-r--r--   1 root supergroup    /d-hbase/.hbase-snapshot/snapshot-test/data.manifest

这里我们通过Java代码去解读这两个文件,参考HBase的工具类ExportSnapshot.java中对快照文件的解析代码

final List<Pair<SnapshotProtos.SnapshotFileInfo, Long>> files = new ArrayList<>();
HBaseProtos.SnapshotDescription snapshotDesc = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);
final TableName table = TableName.valueOf(snapshotDesc.getTable());
SnapshotReferenceUtil.visitReferencedFiles(conf, fs, snapshotDir, snapshotDesc, (regionInfo, family, storeFile) -> {if (!storeFile.hasReference()) {String region = regionInfo.getEncodedName();String hfile = storeFile.getName();Path path = HFileLink.createPath(table, region, family, hfile);SnapshotProtos.SnapshotFileInfo fileInfo = SnapshotProtos.SnapshotFileInfo.newBuilder().setType(SnapshotProtos.SnapshotFileInfo.Type.HFILE).setHfile(path.toString()).build();long size;if (storeFile.hasFileSize()) {size = storeFile.getFileSize();} else {size = HFileLink.buildFromHFileLinkPattern(conf, path).getFileStatus(fs).getLen();}files.add(new Pair<>(fileInfo, size));}
});

通过读取.snapshotinfo得到了snapshotDesc,这个对象中,主要包含了本次snapshot的name和table

通过读取data.manifest得到了本次Snapshots涉及到哪些region以及关联的HFile

这里解析出来的路径格式为 <列族>/<表名>=<reigon名>-<HFile>

解析这个格式,就能得到 “表名”,“列族”,“region”,“HFile”,有了上述信息,就基本能够找到原始的HFile路径。这个HFile的位置可能在data目录下面,也可能在archive目录中,因为表进行过major_compact,HFile会进入archive目录下。所以ExportSnapshot工具在查找snapshot对应的HFile文件时,也是找的data目录或者archive目录。

Clone表的Snapshot

接下来看一下,对clone_snapshot复制出来的表再进行snapshot快照,表中的文件变化是怎样的

执行命令,使用snapshot复制出一张表“clone_table”

clone_snapshot 'snapshot-test', 'clone_table'

查看clone出来的表的文件路径,可以看到这里的HFile其实是个链接文件,链接的是"mytable"表下的eddf78bf298819342f48b8199b3e5269这个Region的5b089dc6f7ca4fb8932aa2899a85f9b2文件

./hdfs dfs -ls /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam
Found 1 items
-rw-r--r--   1 root supergroup         /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam/mytable=eddf78bf298819342f48b8199b3e5269-5b089dc6f7ca4fb8932aa2899a85f9b2

此时观察原始表"mytable"的archive下,已经有一个back-reference文件,以.links-开头的

./hdfs dfs -ls /d-hbase/archive/data/default/mytable/eddf78bf298819342f48b8199b3e5269/fam
Found 1 items
drwxr-xr-x   - root supergroup         /d-hbase/archive/data/default/mytable/eddf78bf298819342f48b8199b3e5269/fam/.links-5b089dc6f7ca4fb8932aa2899a85f9b2

如果此时对clone表,做major_compact

major_compact 'clone_table'

此时会生成一个新的region文件,这是一个真实的数据文件

./hdfs dfs -ls /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam
Found 2 items
-rw-r--r--   1 root supergroup       5084  /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam/50a43588d8b145f89a46649d34ecea42
-rw-r--r--   1 root supergroup          0  /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam/mytable=eddf78bf298819342f48b8199b3e5269-5b089dc6f7ca4fb8932aa2899a85f9b2

那个链接文件“mytable=eddf78bf298819342f48b8199b3e5269-5b089dc6f7ca4fb8932aa2899a85f9b2”,被移除

./hdfs dfs -ls /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam
Found 1 items
-rw-r--r--   1 root supergroup       5084  /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam/50a43588d8b145f89a46649d34ecea42

表在split时的Snapshot

接着对上面那个”clone_table“表进行split,并在split过程中的同时执行snapshot

split 'clone_table','3'
snapshot 'clone_table','clone_table_snapshot'

初始时,在data目录下,父reigon的目录9fe93242bd8a96c80f350f829504cba2目录仍然在,

./hdfs dfs -ls /d-hbase/data/default/clone_table/
Found 5 items
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/.tabledesc
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/.tmp
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/4169b0c3083febcc11ed6e8e716d6f93
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/611efc98e1c72502a0c31536866c4cce
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2

分裂完成后,data目录下的父region目录9fe93242bd8a96c80f350f829504cba2被移除

./hdfs dfs -ls /d-hbase/data/default/clone_table/
Found 4 items
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/.tabledesc
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/.tmp
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/4169b0c3083febcc11ed6e8e716d6f93
drwxr-xr-x   - root supergroup          0  /d-hbase/data/default/clone_table/611efc98e1c72502a0c31536866c4cce

同时观察archive目录,一开始也是有父reigon和子region的目录,子reigon里面的文件是split产生的reference文件,链接的是父reigon的HFile,都是“50a43588d8b145f89a46649d34ecea42-9fe93242bd8a96c80f350f829504cba2”

过了几分钟后,只剩下了父reigon的目录

./hdfs dfs -ls /d-hbase/archive/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam
Found 1 items
-rw-r--r--   1 root supergroup       5084  /d-hbase/archive/data/default/clone_table/9fe93242bd8a96c80f350f829504cba2/fam/50a43588d8b145f89a46649d34ecea42

此时,再通过之前的java代码分析data.manifest中的信息,

发现这里是包含父Region以及分裂后的2个子Region的HFile信息,且关联的子Region里的HFile也是分裂后真实存在的。

这里突然有个疑问,假如后面根据这个文件信息去恢复数据时,会不会重复去把父Region和子Region都去恢复,于是执行了ExportSnapshot命令,将snapshot对应的文件到导出来,导出来的也是包含这3个Region的真实数据文件,这表明此过程中的确会出现有重复数据文件的问题,虽然多个文件会包含同一份数据,不过对业务不会有影响,会随着后续Compact消除掉。

后续继续做了几次相同的试验,在split过程中执行snapshot,data.manifest中有时候出现1个父Region和2个子Region的信息,有时候出现1个父Region和1个子Region的信息,说明打快照是对表的HFile瞬时的记录,并不会特意去等待分裂完成。

了解快照文件的意义

可以基于快照的原理去开发HBase全量数据迁移工具,解析快照元数据,获得表的所有文件路径列表,从而不依赖ExportSnapshot工具,进行更灵活的文件迁移,将表的所有文件通过流的方式拷贝到目的集群HDFS中,进而可以使用LoadIncrementalHFiles这样的工具,将HFile装载到新的表中。

点击关注,第一时间了解华为云新鲜技术~

用DeBug的方式,带你掌握HBase文件在Snapshot的各种变化相关推荐

  1. 详解vue 路由跳转四种方式 (带参数)

    本文介绍了vue 路由跳转四种方式 (带参数),本文通过实例代码给大家介绍的详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1. router-link 1. 不带参数 <router-li ...

  2. vue路由跳转写法在html,详解vue 路由跳转四种方式 (带参数)

    1.  router-link 1. 不带参数 //name,path都行, 建议用name // 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由 ...

  3. python打开setting_Django自带日志 settings.py文件配置方法

    Django settings.py文件配置部分: # logging配置 log_file = '/home/nagain/learn/log' log_file_path = os.path.jo ...

  4. HBase 文件合并

    HBase在存储时, 使用了LSM树来进行数据存储, 会定期将文件进行合并, 以提升数据的查询效率, LSM树都是这么处理的. 那么到这里就有一个问题了, HBase在进行文件合并的时候, 势必会占用 ...

  5. php 拖拽 上传文件 进度,在Vue中如何实现带进度条的文件拖动上传功能

    这篇文章主要介绍了Vue实现带进度条的文件拖动上传功能,本文通过实例代码给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下 1. 基本界面 content="width=devic ...

  6. java http 流_java 模拟http请求,通过流(stream)的方式,发送json数据和文件

    发送端: /** * 以流的方式 * 发送文件和json对象 * * @return */ public static String doPostFileStreamAndJsonObj(String ...

  7. 用VSCode打开带图片的.md文件

    最近自学python发现一个特别好的教程,里面文档都是.md文件并且带图片的,我用sublime,UE等都能打开 不能显示图片,所以就找到用VSCode打开. 把大象放进冰箱分三步,打开带图片的.md ...

  8. JJY本地服务器以服务方式运行不能读取消息文件

    1.问题描述 JJY主服务器采用Windows服务方式运行时,在读tb_0031消息对应的外部文件时失败.而在控制台方式下正常. 读文件失败的结果是单据没有发送,且错误类型是文件路径不存在(ERROR ...

  9. cmake导入so库_通过CMake方式生成动态库so文件

    JNITest 通过CMake方式生成动态库so文件 简介 Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的 ...

最新文章

  1. 关于get和post两种提交方式
  2. 数据结构第二版之(课后题)BF算法病毒感染检测
  3. php 分页类使用,php 分页 分页类 简单实用
  4. 计算机cnc键代表啥,计算器上的cnc键表示啥
  5. nssl1259-sequence【组合数,差分】
  6. lucene_Lucene组件概述
  7. 思科CEO钱伯斯的动荡一年:往事不堪回首
  8. [转载] Java获取嵌套的json串里的返回结果
  9. xenserver 突破VID 2T限制
  10. 允许其他用户通过本计算机连接+连接手机,如何用手机搜索到的WF网络通过数据线连接台式电脑,让台式电脑共享网络...
  11. 使用 ngrok(小米球)实现内网穿透映像到外网访问项目
  12. 6.18-WizNote MD 指南
  13. 基于matlab的2ASK调制解调仿真
  14. SAP UI5 应用开发教程之六十一 - 在 SAP UI5 应用里绘制甘特图 Gantt Chart 试读版
  15. windows下Python集成开发环境-Spyder安装和使用
  16. 【图像处理】图像锐化
  17. 旧照片或胶片着色修复+GAN
  18. Image Signal Processing(ISP)-第三章-BCL, WB, Gamma的原理和软件实现
  19. 【代数之美】线性方程组Ax=0的求解方法
  20. UVa 11942 - Lumberjack Sequencing

热门文章

  1. HTML textarea控件
  2. 虚拟机运行Gazebo出现VMware: vmw_ioctl_command error
  3. arduino openmv 显示图像_6 个芯片打造复古经典计算机:215 色显示,能编程能玩小游戏...
  4. java中数据结构_JAVA中数据结构总结
  5. input和textarea的区别
  6. Java设计模式1:设计模式概论
  7. json与jsonp应用及其他ajax数据交互方式
  8. jvm间歇性崩溃分析
  9. Async/Await FAQ
  10. 关于Mathematica 的cdf 文件的嵌入应用