Ubuntu 环境下 HBase 数据迁移实操指南
一、迁移方案速览与选型
- CopyTable:基于 MapReduce 在表级别复制数据,适合中小规模、需要在线或近实时迁移的场景;对源集群有一定读写压力。支持按时间范围增量同步。
- Export/Import:先 Export 为 SequenceFile 到 HDFS,再 Import 到目标表;适合跨版本迁移或需要中间产物审计/留存的场景。
- DistCp + hbck:直接拷贝底层 HDFS 表目录,再用 hbck 修复元数据与分配;适合停机或低峰窗口的大表迁移。
- Snapshot + ExportSnapshot:对在线业务影响最小,快照元数据拷贝后通过 MR 搬运底层 HFile;推荐用于生产环境、TB 级数据迁移。
- Replication:配置主从复制,持续同步增量;适合长期双活/准实时同步,非一次性迁移。
- 异构导入(如 MySQL→HBase)可用 Sqoop/DataX 等工具,本文聚焦 HBase↔HBase。
二、标准操作步骤
-
Snapshot + ExportSnapshot(推荐)
- 源集群创建快照
hbase shell> snapshot ‘tableA’, ‘tableA_snap’
- 导出快照到目标集群 HDFS(MR 并行拷贝 HFile)
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot
-snapshot tableA_snap
-copy-from hdfs://src-nn:8020/hbase
-copy-to hdfs://dst-nn:8020/hbase
-mappers 16 -bandwidth 100 -overwrite
- 目标集群恢复
hbase shell> disable ‘tableA’
hbase shell> restore_snapshot ‘tableA_snap’
hbase shell> enable ‘tableA’
- 可选:合并小文件,降低文件数
hbase shell> major_compact ‘tableA’
说明:大表建议加 -skip.tmp=true,避免引用临时目录被清理导致 FileNotFound。
-
DistCp + hbck(停机/低峰窗口)
- 源集群刷盘并(建议)停用表
hbase shell> flush ‘tableA’
hbase shell> disable ‘tableA’
- 拷贝表目录到目标集群临时目录
hadoop distcp -m 100 -bandwidth 200
hdfs://src-nn:8020/hbase/data/default/tableA
hdfs://dst-nn:8020/tmp/hbase/tableA
- 目标集群将目录移入 HBase 根目录并修复
sudo -u hbase hdfs dfs -mv /tmp/hbase/tableA /hbase/data/default/tableA
如使用 HBCK2(HBase 2.x+ 推荐)
sudo -u hbase hbase hbck -j /opt/hbase-hbck2/hbase-hbck2-1.1.0.jar
addFsRegionsMissingInMeta default:tableA
sudo -u hbase hbase hbck -j /opt/hbase-hbck2/hbase-hbck2-1.1.0.jar assigns default:tableA
4) 校验
hbase shell> count ‘tableA’
说明:老版本可用 hbck -fixMeta -fixAssignments;HBase 2.x 起更推荐 HBCK2。
-
CopyTable(在线迁移/小中规模)
- 目标集群先建同名同结构表(列族一致)
hbase shell> create ‘tableA’, {NAME => ‘cf’, VERSIONS => 3}
- 可选:降低业务影响(只读或停写窗口)
hbase shell> flush ‘tableA’
- 全量拷贝
hbase org.apache.hadoop.hbase.mapreduce.CopyTable
–peer.adr=dst-zk:2181:/hbase tableA
- 增量同步(按时间窗口)
hbase org.apache.hadoop.hbase.mapreduce.CopyTable
–peer.adr=dst-zk:2181:/hbase
–starttime=1672531200000 --endtime=1672617600000 tableA
- 校验
hbase shell> count ‘tableA’
说明:可按需调节 -Dhbase.client.scanner.caching、并发与带宽参数。
-
Export/Import(跨版本/可审计中间产物)
- 源集群导出
hbase org.apache.hadoop.hbase.mapreduce.Export tableA
hdfs://dst-nn:8020/export/tableA
- 目标集群先建表(列族一致)
hbase shell> create ‘tableA’, {NAME => ‘cf’, VERSIONS => 3}
- 目标集群导入
hbase org.apache.hadoop.hbase.mapreduce.Import tableA
hdfs://dst-nn:8020/export/tableA
- 校验
hbase shell> count ‘tableA’
说明:适合跨版本或需要保留导出文件的场景。
三、迁移前后校验与常见问题
- 校验清单
- 行数对比:count ‘tableA’;抽样对比:scan ‘tableA’, {LIMIT => 1000}。
- 表结构:describe ‘tableA’ 检查列族与版本数。
- Region 健康:hbase hbck(或 HBCK2)检查 REGION_IN_TRANSITION、空洞等。
- 常见问题与处理
- 目标表不存在或列族不匹配:先按源表结构创建目标表。
- 元数据不一致:使用 hbck -fixMeta / -fixAssignments 或 HBCK2 addFsRegionsMissingInMeta + assigns。
- 大表快照导出慢或失败:加 -mappers、-bandwidth,并使用 -skip.tmp=true 避免引用临时目录被清理。
- 迁移期间业务抖动:优先选择 Snapshot;CopyTable 建议在低峰或只读窗口执行;必要时分批次迁移。
四、方法对比与适用场景
| 方法 |
业务影响 |
适用规模 |
跨版本 |
关键优点 |
关键限制 |
| Snapshot + ExportSnapshot |
极小 |
中~大 |
是 |
在线、速度快、一致性好 |
需 HDFS 互通与权限 |
| DistCp + hbck |
需停写/低峰 |
大 |
是 |
简单直接、适合一次性大迁移 |
需停机或严格窗口 |
| CopyTable |
中(全表扫描) |
小~中 |
否 |
配置简单、可增量 |
对源集群有压力 |
| Export/Import |
中 |
小~中 |
是 |
中间产物可审计、跨版本友好 |
需额外存储与两次作业 |
| Replication |
低 |
持续同步 |
否 |
准实时、长期同步 |
非一次性迁移、配置复杂 |