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(默认开启)。
- 权限与安全:确保执行用户对源/目标 HDFS 与 HBase 有读写权限;若启用 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 兼容性,必要时考虑升级路径或选择离线窗口。