共计 6055 个字符,预计需要花费 16 分钟才能阅读完成。
摘要: 把握 Snapshot 能够帮忙咱们很好的实现 HBase 数据备份和数据迁徙的工作。
本文分享自华为云社区《看看 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 装载到新的表中。
点击关注,第一工夫理解华为云陈腐技术~