温馨提示×

HBase 在 Debian 上的数据迁移步骤

小樊
47
2026-01-01 19:43:25
栏目: 智能运维

HBase 在 Debian 上的数据迁移步骤

一 迁移方式选型

  • Snapshot 快照迁移(推荐):对线上影响小、速度快,适合大多数场景。通过 ExportSnapshot 将快照拷贝到目标集群 HDFS,再在目标集群 restore/clone 快照。支持跨小版本迁移,尽量避免跨大版本。适合离线或准在线迁移。
  • Replication + Snapshot 不停服迁移:先建立主从复制,历史数据用快照一次性迁移,增量由复制追平,切换窗口短,适合要求业务连续性的场景。
  • Export/Import:将表数据导出为 SequenceFile 再导入目标表,支持多版本与时间段导出,但会对源表产生 Scan 压力。
  • CopyTable:基于 MR 的 Scan + Put,适合小表或可接受停写的场景,对大表与高 QPS 表影响明显。
  • DistCp 文件层拷贝:直接拷贝底层 HDFS 数据,再修复元数据/分配 Region,适合历史表或可接受停写的场景;需保证两端 HBase 版本尽量一致。

二 通用前置检查

  • 确认两端 HDFS 地址、端口 与网络互通,且 HBase 根目录(hbase.rootdir) 一致或已规划好目标路径。
  • Debian 节点准备执行环境:安装 OpenJDK 8+、配置 JAVA_HOME,确保 HBase/Hadoop/YARN 可用,迁移任务建议提交到 YARN
  • 在源集群开启快照:检查 hbase.snapshot.enabled=true(默认开启)。
  • 权限与安全:确保执行用户对源/目标 HDFSHBase 有读写权限;若启用 Kerberos,需完成票据或按环境配置跨域访问。
  • 版本策略:尽量保持 HBase 版本相近;跨大版本需谨慎评估兼容性(特别是 HDFS RPC/Protobuf 差异)。

三 推荐方案 Snapshot 迁移步骤

  • 源集群准备
    • hbase shell 中 flush 表并创建快照:
      • flush ‘table_name’
      • snapshot ‘table_name’, ‘table_name_snap’
      • list_snapshots 确认快照就绪
  • 拷贝快照到目标集群
    • 在任一源/目标节点以 hbase 用户执行(示例为跨集群拷贝):
      • hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot table_name_snap \ -copy-from hdfs://src-nn:8020/hbase \ -copy-to hdfs://dst-nn:8020/hbase \ -mappers 16 -bandwidth 100 -overwrite
    • 大表建议加参数:
      • -Dsnapshot.export.skip.tmp=true(避免 .tmp 引用清理导致 FileNotFound)
      • -Dmapreduce.map.memory.mb=2048(按集群资源调整)
  • 目标集群恢复
    • 同名表覆盖恢复:
      • disable ‘table_name’
      • restore_snapshot ‘table_name_snap’
      • enable ‘table_name’
    • 或克隆为新表:
      • clone_snapshot ‘table_name_snap’, ‘table_name_new’
  • 校验
    • 对比行数/Region 分布/关键样例数据:
      • count ‘table_name’(大数据量表建议采样或按 Region 校验)
      • hbase hbck 检查一致性

四 不停服迁移 Replication + Snapshot

  • 在目标集群创建与源集群同结构的表(列族、版本、TTL、压缩等保持一致)。
  • 源集群开启复制范围并添加复制关系:
    • disable ‘table_name’
    • alter ‘table_name’, {NAME => ‘cf’, REPLICATION_SCOPE => ‘1’}
    • enable ‘table_name’
    • add_peer ‘peer1’, ‘zk1:2181:/hbase’
    • set_peer_tableCFs ‘peer1’, ‘table_name’
  • 同步历史数据:在源集群创建快照并用 ExportSnapshot 拷贝到目标集群 HDFS,然后在目标集群 restore 快照。
  • 追平增量:保持复制运行,待复制位点追平后,选择低峰期短暂停止写入,完成最终一致性校验与业务切换,最后移除复制关系。

五 其它方案与常见问题

  • CopyTable(适合小表或可接受停写)

    • 目标集群先建表,源端执行:
      • hbase org.apache.hadoop.hbase.mapreduce.CopyTable \ –peer.adr=zk_dst:2181:/hbase table_name
    • 支持按时间范围迁移(–starttime/–endtime)与列族过滤(–families)。
  • Export/Import(支持多版本/时间段)

    • 导出:
      • hbase org.apache.hadoop.hbase.mapreduce.Export table_name \ hdfs://dst-nn:8020/tmp/exp_table versions 3 1620000000000 1620086400000
    • 导入:
      • hbase org.apache.hadoop.hbase.mapreduce.Import table_name \ hdfs://dst-nn:8020/tmp/exp_table
    • 适合跨版本/跨环境,但 Scan 阶段对源集群有压力。
  • DistCp 文件层迁移(适合历史表)

    • 步骤:flush 表 → 用 DistCp 拷贝表目录到目标 HDFS 临时目录 → 移动到目标表目录 → 使用 hbck2 修复元数据与分配 Region:
      • flush ‘table_name’
      • hadoop distcp -m 100 hdfs://src-nn:8020/hbase/data/default/table_name hdfs://dst-nn:8020/tmp/table_name
      • hdfs dfs -mv /tmp/table_name /hbase/data/default/table_name
      • hbase hbck -j hbase-hbck2-1.1.0.jar addFsRegionsMissingInMeta default:table_name
      • hbase hbck -j hbase-hbck2-1.1.0.jar assigns
    • 注意两端 HBase 版本尽量一致,避免 Region 元数据不兼容。
  • 常见问题与要点

    • 大表快照导出加 -Dsnapshot.export.skip.tmp=true,避免 .tmp 引用被清理导致 FileNotFoundException
    • 迁移后使用 hbck/hbck2 校验并修复 meta/分配 问题。
    • 权限与安全:确保 HDFS/HBase 权限一致;跨 Kerberos 环境需正确票据或配置。
    • 版本兼容:跨大版本需评估 HDFS RPC/Protobuf 差异与 HBase 兼容性,必要时考虑升级路径或选择离线窗口。

0