Debian上HBase数据迁移步骤
一、迁移方式速览与选择
- ExportSnapshot 快照导出/导入(推荐):对线上影响小,适合跨集群、跨版本迁移;通过 HDFS 拷贝快照后在目标集群恢复。
- DistCp + BulkLoad:先停写/Flush,DistCp 拷贝 HFiles,再用 LoadIncrementalHFiles 导入;适合历史表或可接受短暂停写的场景。
- CopyTable:基于 MapReduce 在线拷贝表数据,可跨集群;对源集群有一定读压力,适合中小规模或阶段性迁移。
- Export/Import:先 Export 成 SequenceFile,再 Import 到目标表;适合跨版本,但仍需全表扫描。
- Replication:基于 WAL 的异步复制,适合持续同步/双活,非一次性迁移。
选择建议:优先用快照;历史数据且可停写用DistCp+BulkLoad;在线小中规模用CopyTable;跨版本可选Export/Import;需要持续同步用Replication。
二、通用前置检查
- 网络与权限:确保源/目标集群各节点网络互通,HDFS 与 HBase 端口放通,运行用户具备相应权限(HDFS 读写、HBase 管理员/表权限)。
- 版本与兼容性:HBase 大版本差异可能影响兼容性;若走 HDFS 层(DistCp/HFiles),需保证 Hadoop 版本兼容或谨慎处理。
- 表结构一致性:目标表需提前创建,列族名称、压缩/加密/版本数等保持一致;如需复制部分数据,明确 startrow/stoprow/starttime/endtime。
- 资源与并发:为 MR 作业合理设置 mappers、带宽与 JVM 参数,避免影响线上业务。
- 高可用:确认 ZooKeeper 与 HMaster 正常,迁移窗口内避免主备切换导致作业中断。
三、方法一 快照导出导入步骤(推荐)
- 源集群创建快照
- 进入 HBase Shell:hbase shell
- 创建快照:snapshot ‘tableA’, ‘snapA’
- 将快照拷贝到目标集群 HDFS
- 使用 ExportSnapshot(在任一能访问两边的客户端/网关执行):
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot snapA \
-copy-from hdfs://src-nn:8020/hbase \
-copy-to hdfs://dst-nn:8020/hbase \
-mappers 20 -bandwidth 50
- 目标集群恢复快照
- hbase shell
- 恢复:restore_snapshot ‘snapA’
- 如目标表已存在且需覆盖,先 disable ‘tableA’ 再 restore_snapshot,随后 enable ‘tableA’
- 校验
- 对比行数:count ‘tableA’(源/目标分别执行)
- 抽样校验关键数据/Region 分布
说明:快照方式对线上影响小、效率高,适合跨集群与跨版本迁移。
四、方法二 DistCp 加 BulkLoad 步骤(适合历史表)
- 源集群准备
- 建议先停写并 Flush:flush ‘tableA’(或 disable ‘tableA’ 确保一致性)
- 拷贝 HFiles 到目标 HDFS
- hadoop distcp -m 50 hdfs://src-nn:8020/hbase/data/default/tableA \
hdfs://dst-nn:8020/hbase/data/default/tableA
- 目标集群导入
- 确保目标表已创建且列族一致
- 使用 HBase 自带的 BulkLoad 工具(通常通过 HFileOutputFormat 生成 HFiles 后执行):
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
hdfs://dst-nn:8020/hbase/data/default/tableA tableA
- 修复元数据与分配
- hbase hbck -fixMeta -fixAssignments
- 校验
- count ‘tableA’、抽样对比
说明:该方式对业务影响可控(停写窗口短),但需保证两端 Hadoop 版本兼容;适合一次性迁移历史数据。
五、方法三 CopyTable 与 ExportImport 步骤(在线/跨版本)
- CopyTable(在线拷贝,适合中小规模或阶段性迁移)
- 目标表先行创建(列族一致)
- 执行拷贝(跨集群需指定对端 ZK):
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–peer.adr=zk1,zk2,zk3:2181:/hbase \
-Dhbase.client.scanner.caching=300 \
-Dmapred.map.tasks.speculative.execution=false \
tableA
- 校验:count ‘tableA’、抽样对比
- Export/Import(跨版本友好,但需全表扫描)
- 源集群导出:
hbase org.apache.hadoop.hbase.mapreduce.Export tableA \
hdfs://dst-nn:8020/migration/tableA_export 3
- 目标集群导入(目标表需存在):
hbase org.apache.hadoop.hbase.mapreduce.Import tableA \
hdfs://dst-nn:8020/migration/tableA_export
- 校验:count ‘tableA’、抽样对比
说明:CopyTable 会对源表产生读压力;Export/Import 通过中间文件落地,便于跨版本与审计。