在 Ubuntu 上进行 HBase 数据迁移的实用步骤
一、迁移方式速览与选择
- Export/Import:先导出为 SequenceFile,再导入目标集群;可跨小版本,适合一次性全量迁移或带时间窗的历史数据迁移。
- Snapshot + ExportSnapshot:对线上影响最小,快照是元数据拷贝,再通过 MR 将底层 HFile 复制到目标集群,适合大体量、在线不停写场景。
- DistCp + LoadIncrementalHFiles:先停写/flush,直接拷贝 HDFS 上的表目录到目标集群,再用 LoadIncrementalHFiles 批量加载,速度快、可控性强。
- CopyTable:基于 MR 的全表/部分扫描复制,适合小中体量或临时同构集群间迁移。
- Replication:建立主从复制关系做持续同步,适合准实时双活/近实时迁移。
选择建议:大体量优先 Snapshot/ExportSnapshot;需要跨版本或离线归档选 Export/Import;已有停机窗口且追求极致速度选 DistCp+LoadIncrementalHFiles;持续同步选 Replication。
二、方案一 Snapshot + ExportSnapshot(推荐,在线迁移)
- 源集群准备
- 在 hbase shell 创建快照(表需在线,建议先 flush):
flush ‘your_table’
snapshot ‘your_table’, ‘your_table_snap’
- 使用 ExportSnapshot 将快照复制到目标 HDFS(示例带带宽与并发控制):
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot your_table_snap \
-copy-from hdfs://src-nn:8020/hbase \
-copy-to hdfs://dst-nn:8020/hbase \
-mappers 16 -bandwidth 200 -overwrite
- 目标集群恢复
- 在 hbase shell 恢复或克隆快照:
restore_snapshot ‘your_table_snap’
或克隆为新表:clone_snapshot ‘your_table_snap’, ‘your_table_new’
- 如导入后 region 分布不均或元数据异常,使用 hbck2 修复(HBase 2.x+ 推荐):
hbase hbck -j /opt/hbase-operator-tools/hbase-hbck2-1.1.0.jar assigns
- 适用要点:对线上影响小、可跨集群/跨版本、适合 TB 级数据。
三、方案二 Export/Import(跨版本、离线迁移)
- 源集群导出
- 可选:flush 并限定时间窗/版本数
flush ‘your_table’
hbase org.apache.hadoop.hbase.mapreduce.Export \
your_table /hbase/export/your_table 3 20240101000000 20241231235959
- 目标集群导入
- 先在目标集群用相同 表结构/列族 建表(如已有数据可先 disable/truncate):
create ‘your_table’, ‘cf1’, ‘cf2’
- 执行导入(MR 作业):
hbase org.apache.hadoop.hbase.mapreduce.Import your_table /hbase/export/your_table
- 适用要点:通过中间文件落地,便于审计与重放;适合跨小版本迁移或带时间窗的历史回填。
四、方案三 DistCp + LoadIncrementalHFiles(停机窗口、极致速度)
- 源集群准备
- 停写并 flush:
disable ‘your_table’
flush ‘your_table’
- 直接拷贝表目录到目标 HDFS(示例):
hadoop distcp -m 100 hdfs://src-nn:8020/hbase/data/default/your_table \
hdfs://dst-nn:8020/hbase/data/default/your_table_tmp
- 目标集群加载
- 移动目录到正式位置并修复元数据/分配 region:
hdfs dfs -mv /hbase/data/default/your_table_tmp /hbase/data/default/your_table
hbase hbck -fixMeta -fixAssignments
- 使用 LoadIncrementalHFiles 将 HFile 批量加载进表(推荐):
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
/hbase/data/default/your_table your_table
- 适用要点:拷贝即 HFile,速度快;需停机或确保无写入;适合大体量一次性迁移。
五、迁移前后校验与常见问题
- 校验清单
- 行数/分区数:count ‘your_table’, CACHE=>10000;scan ‘your_table’, LIMIT=>10 抽样核对。
- 一致性:对比源/目标关键指标(region 数、storefile 数、总大小)。
- 可用性:随机读写/扫描验证。
- 常见问题与处理
- 元数据不一致或 region 未分配:使用 hbck2 执行 assigns/fixMeta/fixAssignments。
- 快照导出大表异常:ExportSnapshot 加参数 -Dsnapshot.export.skip.tmp=true,避免 .tmp 清理导致 FileNotFoundException。
- 不停写迁移:优先 Snapshot/ExportSnapshot;若用 CopyTable/Export/Import,尽量在低峰期并控制 scan 缓存与并发。
- 版本与兼容性:跨小版本优先 Export/Import;同版本优先 Snapshot。
- 持续同步:建立 Replication 做准实时迁移,再一次性切换。
- 以上校验与修复命令示例与工具选择要点可参考实践文档。