Debian 环境下 HBase 数据迁移实操指南
一、常用方案与适用场景
- ExportSnapshot(推荐):对线上影响最小,基于 HBase 快照将表的 HFile 复制到目标集群 HDFS,再在目标集群恢复;适合TB 级数据、在线迁移与跨版本迁移。
- CopyTable:通过 MapReduce 全表扫描复制,可指定时间范围/列族,适合小中体量或增量同步;对源集群有一定读压力。
- Export/Import:先 Export 为 SequenceFile 再 Import,便于跨版本与审计留痕;同样会全表扫描。
- DistCp + BulkLoad:源表先 Disable + Flush,用 DistCp 拷贝 HFile 到目标 HDFS,再用 LoadIncrementalHFiles 导入;适合离线批量迁移。
- Replication:基于 WAL 的异步复制,适合持续双写到新集群的准实时迁移与容灾。
- 异构导入(如 Sqoop/DataX)用于将关系型数据库等导入 HBase,非 HBase→HBase 场景。
以上工具均为 HBase 官方常用手段,选型时优先考虑数据量、停机窗口、版本兼容与对线上影响。
二、标准流程 ExportSnapshot(推荐)
- 前提准备
- 两集群网络互通(端口、DNS/hosts 可解析),HDFS 互通;目标集群 HMaster/RegionServer 正常运行。
- 源集群开启快照:确认 hbase.snapshot.enabled=true。
- 目标集群按源表结构先建表(列族、版本、TTL、压缩、预分裂等保持一致)。
- 操作步骤
- 源集群创建快照
hbase shell> snapshot ‘src_table’, ‘snap_20251215’
- 使用 ExportSnapshot 拷贝快照到目标 HDFS(建议在新集群 YARN 上运行,降低对源集群影响)
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot
-snapshot snap_20251215
-copy-from hdfs://src-nn:8020/hbase
-copy-to hdfs://dst-nn:8020/hbase
-mappers 20 -bandwidth 50
- 目标集群恢复快照
hbase shell> disable ‘src_table’
hbase shell> restore_snapshot ‘snap_20251215’
hbase shell> enable ‘src_table’
- 可选:合并小文件,提升查询性能
hbase shell> major_compact ‘src_table’
- 校验
hbase shell> count ‘src_table’
hbase shell> scan ‘src_table’, {LIMIT => 10}
- 说明
- 该方式不拷贝 HLog,仅复制底层 HFile,对线上干扰小;适合在线迁移与跨版本场景。
- 若目标集群启用 HMaster 定时清理/HFile 保留策略,请在导入后适当调整,避免清理掉刚恢复的快照文件。
三、其它方案速览与命令示例
- CopyTable(适合小中体量或增量)
- 全量:
hbase org.apache.hadoop.hbase.mapreduce.CopyTable
–peer.adr=zk1,zk2,zk3:/hbase src_table
- 增量(时间窗):
hbase org.apache.hadoop.hbase.mapreduce.CopyTable
–starttime=1700000000000 --endtime=1702592000000
–peer.adr=zk1,zk2,zk3:/hbase src_table
- 常用调优:
-Dhbase.client.scanner.caching=300
-Dmapred.map.tasks.speculative.execution=false
- Export/Import(跨版本友好)
- 导出:
hbase org.apache.hadoop.hbase.mapreduce.Export src_table hdfs://dst-nn:8020/migration/src_table
- 导入(目标表需提前建好):
hbase org.apache.hadoop.hbase.mapreduce.Import src_table hdfs://dst-nn:8020/migration/src_table
- DistCp + BulkLoad(离线批量)
- 源端落盘:
hbase shell> flush ‘src_table’
hbase shell> disable ‘src_table’
- 拷贝 HFile:
hadoop distcp hdfs://src-nn:8020/hbase/data/default/src_table
hdfs://dst-nn:8020/hbase/tmp/src_table_hfiles
- 目标端导入:
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles
hdfs://dst-nn:8020/hbase/tmp/src_table_hfiles src_table
- Replication(准实时双写)
- 源表开启复制范围:
hbase shell> alter ‘src_table’, {NAME => ‘cf’, REPLICATION_SCOPE => ‘1’}
- 目标集群开启复制并新增 peer:
hbase shell> add_peer ‘1’, ‘zk1,zk2,zk3:/hbase’
hbase shell> start_replication
- 提示:CopyTable/Export/Import 都会全表扫描,建议在低峰期执行并合理设置 Map 数、缓存与推测执行参数。
四、迁移前后校验与常见问题
- 校验清单
- 行数对比:count 源表与目的表;抽样 scan 对比关键行。
- 列族/版本/TTL:describe 比对表结构一致性。
- Region 分布:对比 region 数量与负载是否均衡。
- 数据正确性:抽样 Get/Scan 验证热点与边界数据。
- 常见问题与处理
- 权限/ACL:两集群 HDFS/HBase 账号与权限需一致;跨域访问需开通网络与权限策略。
- Kerberos:两端认证策略需一致;若一端未启用,可通过 ipc.client.fallback-to-simple-auth-allowed 兼容(仅限受控场景)。
- 版本差异:跨大版本优先用 ExportSnapshot/Export+Import;极端差异需评估 HFile/Protobuf 兼容性。
- 云环境限制:部分云 HBase 默认不开放 HDFS 端口,基于 HDFS 的 DistCp/Snapshot 可能不可用,可改用 CopyTable。
- 清理策略:迁移后关注 HMaster 文件保留/HFile 清理 配置,避免误删新导入文件。