新旧 Hbase 集群间数据迁移

40 阅读3分钟

Hbase 表是基于 hadoop HDFS 构建,所以 Hbase 的迁移可从两个维度来看,基于 hadoop HDFS 的 distcp 的迁移方式和基于 Hbase 表结构的 Hbase 层面提供的相关工具迁移。

3f768ac65819cd9b20166b0505876ad1

如上图所示,HBase 迁移有多种方案,其中基于 Snapshot 的迁移方式是推荐的迁移方案。

下面给出 Snapshot 方式进行数据迁移的方式,迁移背景是,两个无法通信的 Hbase 集群之间进行数据迁移

下面例子中以迁移一张名为 OGE_Vector_Fact_Table 的表为例

1 创建快照

  • 在旧集群上为要迁移的表创建快照
hbase shell
> snapshot 'OGE_Vector_Fact_Table', 'OGE_Vector_Fact_Table_snapshot'

2 复制快照和表的数据到新集群

  • 如果两个集群之间可以通信,则可以使用 distcp 命令进行快照迁移,命令如下:
# 复制快照
hadoop distcp hdfs://old-cluster/hbase/.hbase-snapshot/OGE_Vector_Fact_Table_snapshot hdfs://new-cluster/hbase/.hbase-snapshot/

# 复制表数据
hadoop distcp hdfs://old-cluster/hbase/data/default/OGE_Vector_Fact_Table hdfs://new-cluster/hbase/data/default/

# 附:新集群上查看快照
hbase shell
> list_snapshots

# 附:删除快照
hbase shell
> delete_snapshot 'OGE_Vector_Fact_Table_snapshot'
  • 我们这里两个集群无法通信,因此采用拷贝至本地再上传至新集群 hdfs 上的方式:

转移快照

# 将快照从旧集群hdfs上拷贝至本机,然后将该文件夹转移至另一个服务器集群上
hadoop fs -copyToLocal /hbase/.hbase-snapshot/OGE_Vector_Fact_Table_snapshot /mnt/oge/hbase-snapshot

# 在新集群机器上将快照文件夹上传至hdfs
hadoop fs -copyFromLocal /mnt/oge/hbase-snapshot/OGE_Vector_Fact_Table_snapshot /hbase/.hbase-snapshot

转移表数据

# 将快照从旧集群hdfs上拷贝至本机,然后将该文件夹转移至另一个服务器集群上
hadoop fs -copyToLocal /hbase/data/default/OGE_Vector_Fact_Table /mnt/oge/hbase-data

# 在新集群机器上将表数据上传至hdfs
hadoop fs -copyFromLocal /mnt/oge/hbase-data/OGE_Vector_Fact_Table /hbase/data/default

3 恢复快照

  • 在新集群上通过克隆快照恢复表
hbase shell
> clone_snapshot 'OGE_Vector_Fact_Table_snapshot', 'OGE_Vector_Fact_Table'
  • 检查新表大小以及数据是否都正确
hbase shell
> scan 'OGE_Vector_Fact_Table'
> count 'OGE_Vector_Fact_Table'

4 其他说明

  • /hbase/data/default/OGE_Vector_Fact_Table/hbase/archive/data/default/OGE_Vector_Fact_Table 目录内容可能不完全一样。主要区别在于:

    • /hbase/data/default/OGE_Vector_Fact_Table:这是表的活动数据目录,存储当前正在使用的数据文件。

    • /hbase/archive/data/default/OGE_Vector_Fact_Table:这是已归档的数据目录,用于存储表的历史数据文件,通常在表被删除或重大数据变更时使用。

  • 详细说明

    • 活动数据目录:存储表的实时数据,包括所有活跃的HFiles和元数据。

    • 归档数据目录:当表被删除或进行数据压缩、快照等操作时,原始数据会被移动到归档目录中,以便在需要时恢复。

通过比较两个目录的内容,你可以看到是否有任何差异。请注意,快照和数据归档操作会影响这些目录的内容。

在HBase中,restore_snapshotclone_snapshot 在恢复数据时有不同的用法和目的:

  • restore_snapshot

    • 用法:将现有表恢复到快照的状态。

    • 特点:破坏性操作,当前表数据会被快照数据替代。

    • 示例

      hbase shell
      > restore_snapshot 'my_snapshot'
      
  • clone_snapshot

    • 用法:从快照中创建一个新表,不影响现有表。

    • 特点:非破坏性操作,允许恢复数据到不同的表名。

    • 示例

      hbase shell
      > clone_snapshot 'my_snapshot', 'new_table'