如何使用HBase快照实现跨集群全量与增量数据迁移

时间:2022-05-06
本文章向大家介绍如何使用HBase快照实现跨集群全量与增量数据迁移,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

1.文档编写目的


我们常常会碰到需要迁移HBase数据的场景,当一个HBase集群运行较长时间后,往往数据量都会很大,HBase集群往往支撑的都是线上的业务,不像跑批的Hive/Spark集群,不能随便停机。HBase默认提供import/export方法支持备份和还原,而且支持增量,但是因为是使用HBase的API导出和还原数据,对RegionServer的压力会很大,往往会影响旧集群的在线业务。

在前面的文章Fayson也讲过《如何在CDH中使用HBase快照》,HBase自身也提供了ExportSnapshot的方法可以从HDFS文件层基于某个快照快速的导出HBase的数据,并不会对RegionServer造成影响,但该源生的方法不支持增量。该文档主要通过使用HBase快照导出历史全量数据并还原到新的HBase集群,然后改造源生的ExportSnapshot类,通过比较变化的文件实现导出增量,并最终实现HBase跨集群的增量备份和还原。文末附github源码。

  • 内容概述

1.通过快照实现HBase跨集群的全量数据备份和还原

2.改造ExportSnapshot类说明

3.通过快照实现HBase跨集群的增量数据备份和还原

4.github源码和总结

  • 测试环境

1.CM和CDH版本为5.13.0

2.使用root用户操作

  • 前置条件

1.HBase0.95+

2.测试表信息描述


使用HBase的PerformanceEvaluation生成一张SNAPPY格式的表

1.使用HBase的pe命令生成一个10G的表

[root@ip-172-31-5-190 fayson]# hbase org.apache.hadoop.hbase.PerformanceEvaluation --compress=SNAPPY --size=10 sequentialWrite 10

2.TestTable表结构

hbase(main):013:0* desc 'TestTable'
Table TestTable is ENABLED                                                                                      
TestTable                                                                                                       
COLUMN FAMILIES DESCRIPTION                                                                                     
{NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSION => '
SNAPPY', VERSIONS => '1', TTL => 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65
536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}                                                               
1 row(s) in 0.0540 seconds

hbase(main):014:0> 

3.TestTable表HDFS大小

[root@ip-172-31-6-148 ~]# hadoop fs -du -h /hbase/data/default/
2.5 G  7.5 G  /hbase/data/default/TestTable
334    1002    /hbase/data/default/picHbase
[root@ip-172-31-6-148 ~]# 

此处由于指定了TestTable表的压缩格式为SNAPPY,所以在HDFS上只有2.5GB

4.TestTable表的总数据量,共10485760条数据

3.通过快照实现HBase跨集群的全量数据备份和还原

3.1生成TestTable表快照


通过CM生成TestTable表快照TestTable-snapshot1

3.2导出TestTable快照数据


1.在命令行使用HBase自带的ExportSnapshot导出快照

[root@ip-172-31-6-148 ~]# hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot TestTable-snapshot1 -copy-to hdfs://ip-172-31-6-148.fayson.com:8020/hbasebackup/TestTable-snapshot1

2.查看导出的快照数据

[root@ip-172-31-6-148 ~]# hadoop fs -ls /hbasebackup/TestTable-snapshot1
Found 2 items
drwxr-xr-x   - root supergroup          0 2017-11-02 04:22 /hbasebackup/TestTable-snapshot1/.hbase-snapshot
drwxr-xr-x   - root supergroup          0 2017-11-02 04:21 /hbasebackup/TestTable-snapshot1/archive
[root@ip-172-31-6-148 ~]# 

3.查看导出快照数据大小

[root@ip-172-31-6-148 ~]# hadoop fs -du -h /hbasebackup/TestTable-snapshot1
1.2 K  3.6 K  /hbasebackup/TestTable-snapshot1/.hbase-snapshot
2.5 G  7.6 G  /hbasebackup/TestTable-snapshot1/archive
[root@ip-172-31-6-148 ~]# 

可以看到导出快照实际是把快照的信息及快照记录的所有数据文件分别导出到指定目录下的.hbase-snapshot和archive目录下。

导出快照总耗时:50sec

3.3导入快照并恢复TestTable表


Fayson这里使用的是一个集群做快照导出与恢复操作,所以这里先把集群TestTable的快照和表删掉,然后再通过导出快照和数据将TestTable表恢复

1.通过CM删除TestTable-snapshot1快照数据

2.通过hbase shell把TestTable DROP掉

[root@ip-172-31-6-148 ~]# hbase shell
hbase(main):002:0> disable 'TestTable'
hbase(main):003:0> drop 'TestTable'

确认TestTable表的数据已完全被清除

3.将导出的快照数据恢复至相应的目录

[root@ip-172-31-6-148 ~]# sudo -u hbase hadoop fs -cp /hbasebackup/TestTable-snapshot1/.hbase-snapshot/TestTable-snapshot1 /hbase/.hbase-snapshot
[root@ip-172-31-6-148 ~]# sudo -u hbase hadoop fs -cp /hbasebackup/TestTable-snapshot1/archive/data/default/TestTable /hbase/archive/data/default/

将导出的快照目录拷贝至/hbase/.hbase-snapshot目录,导出的归档文件拷贝至/hbase/archive目录下,如果目录不存在则直接使用导出的归档目录覆盖/hbase/archive目录即可。

4.通过CM界面,使用TestTable-snapshot1快照恢复TestTable表

此时可以看到TestTable状态为已删除,接下来执行快照恢复操作

表状态显示正常

5.验证恢复后的表数据是否与快照时数据一致

通过快照恢复的数据与快照时的数据总条数一致,表内容一致。

快照恢复总耗时:23.89s

4.通过快照实现HBase跨集群的增量数据备份和还原

4.1修改TestTable表数据


1.使用Pe命令为TestTable表每一行增加一列Cloumn

[root@ip-172-31-6-148 ~]# hbase pe append 1

增加后的数据显示

2.通过hbase shell随机修改和删除表数据

put 'TestTable','00000000000000000000000000','info:0','00000000000'
put 'TestTable','00000000000000000000000000','info:AppendTest','00000'
deleteall 'TestTable','00000000000000000000000001'
deleteall 'TestTable','00000000000000000000000005'
deleteall 'TestTable','00000000000000000000009991'
put 'TestTable','00000000000000000000000009','info:AppendTest','99999999'
delete 'TestTable','00000000000000000000012345','info:0'

3.TestTable表的数据总量为10485757

4.2再次创建TestTable表快照


创建TestTable-snapshot2快照耗时:10.92s

4.3导出第二次快照的增量数据


这一步主要是将TestTable-snapshot2与TestTable-snapshot1两次快照之间的增量数据导出,HBase默认的ExportSnapshot方法是没有增量快照导出的方法,这里Fayson在原有快照导出的基础上对源码进行修改,来完成两个快照之间增量数据的导出。

1.在命令行执行如下命令将两次快照的增量数据导出到HDFS

[root@ip-172-31-6-148 ~]# hbase org.hadoop.hbase.dataExport.ExportSnapshot -snapshot TestTable-snapshot2 -copy-to hdfs://ip-172-31-6-148.fayson.com:8020/hbasebackup/snapshot2-snapshot1/ -snapshot-old TestTable-snapshot1

2.导出的数据目录

[root@ip-172-31-6-148 ~]# hadoop fs -du -h /hbasebackup/snapshot2-snapshot1
1.6 K    4.7 K  /hbasebackup/snapshot2-snapshot1/.hbase-snapshot
655.6 M  1.9 G  /hbasebackup/snapshot2-snapshot1/archive
[root@ip-172-31-6-148 ~]# 

导出增量快照数据总耗时:17sec

通过以上导出的快照数据文件及大小可以看出使用快照增量导出的方式只将快照中有变化的数据文件导出,而非导出表的全量数据。

4.4导入增量快照数据并恢复表


1.导入增量数据前相应目录数据

HBase的快照目录

归档目录TestTable表数据

2.将导出的快照增量数据导入到HDFS相应目录

[root@ip-172-31-6-148 lib]# sudo -u hbase hadoop fs -cp /hbasebackup/snapshot2-snapshot1/.hbase-snapshot/TestTable-snapshot2 /hbase/.hbase-snapshot
[root@ip-172-31-6-148 lib]# sudo -u hbase hadoop fs -cp /hbasebackup/snapshot2-snapshot1/archive/data/default/TestTable /hbase/archive/data/default/

3.导入增量数据后数据目录

HBase快照目录

归档目录数据

4.通过CM界面使用TestTable-snapshot2快照恢复TestTable表数据

快照恢复总耗时:49.84s

5.通过CM界面使用TestTable-snapshot2快照恢复TestTable表数据

表数据大小:10485757

5.增量导出源码修改说明


1.代码中增加对比快照参数-snapshot-old

if (cmd.equals("-snapshot")) {
    snapshotName = args[++i];
} else if (cmd.equals("-snapshot-old")) {
    snapshotOldName = args[++i];
} else if (cmd.equals("-target")) {
    targetName = args[++i];
}

2.修改导出文件逻辑,对比新旧快照文件列表差异,将有差异的数据文件导出

//TODO 增加快照增量文件判断逻辑
String snapshotOldPath = conf.get(CONF_SNAPSHOT_OLD_DIR);
if(snapshotOldPath != null && snapshotOldPath.length() > 0) {
    LOG.info("测试snapshotOldDir:" + conf.get(CONF_SNAPSHOT_OLD_DIR));
    Path snapshotOldDir = new Path(conf.get(CONF_SNAPSHOT_OLD_DIR));
    FileSystem oldFs = FileSystem.get(snapshotOldDir.toUri(), conf);

    List<Pair<SnapshotFileInfo, Long>> snapshotOldFiles = getSnapshotFiles(conf, oldFs, snapshotOldDir);
    Set<String> oldFiles = new HashSet<String>();
    for(Pair<SnapshotFileInfo, Long> pair : snapshotOldFiles) {
        LOG.info("测试OLD:SnapShotFileInfo:" + pair.getFirst().getHfile());
        oldFiles.add(pair.getFirst().getHfile());
    }

    for(Pair<SnapshotFileInfo, Long> pair : origSnapshotFiles) {
        String hfile = pair.getFirst().getHfile();
        if(!oldFiles.contains(hfile)) {
            LOG.info("新增的:SnapShotFileInfo:" + pair.getFirst().getHfile());
            snapshotFiles.add(pair);
        }
    }
} else {
    snapshotFiles = origSnapshotFiles;
}

3.将修改的源码编译成dataExport-0.0.1-SNAPSHOT.jar包,将该jar文件放入/opt/cloudera/parcels/CDH/lib/hbase/lib目录下

具体请参考github源码地址:https://github.com/javaxsky/hbaseexport

6.总结


  • HBase的Snapshot仅涉及metadata的记录,不会涉及数据的拷贝
  • HBase的ExportSnapshot导出快照操作时在HDFS层级进行的,不会对HBase的Master和RegionServer服务造成额外的负担。
  • 重写的ExportSnapshot增量快照导出是通过两个快照文件列表的差异实现,只需要将有差异的文件导出即可。
  • 使用ExportSnapshot导出快照数据时未造成导出数据膨胀,与原始启用了Snappy压缩的HBase表大小基本一致。
  • 在修改HBase自带的ExportSnapshot,需要根据对应的HBase版本获取源码进行修改,不同版本的ExportSnapshot的Packages路径有改动。
  • 在跨集群传输SnapShot文件时推荐使用Cloudera企业版功能BDR,实现跨集群的文件拷贝传输。

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。


推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操