在 CentOS 上做 HBase 数据迁移的常用方法与步骤
一、方法速览与选型
| 方法 | 适用场景 | 停机要求 | 优点 | 关键命令 |
|---|---|---|---|---|
| Export/Import | 跨版本或一次性全量迁移 | 建议短暂停写 | 实现简单、可跨版本 | Export: hbase org.apache.hadoop.hbase.mapreduce.Export <table> <hdfs_out>;Import: hbase org.apache.hadoop.hbase.mapreduce.Import <table> <hdfs_in> |
| ExportSnapshot | 同构集群、TB 级大表、尽量不停写 | 可不停写(建议 flush/短暂限流) | 对线上影响小、速度快 | snapshot 'snap',hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snap -copy-to hdfs://dst/...,目标端 restore_snapshot 'snap' |
| CopyTable | 在线迁移/小中规模(<10T) | 可在线 | 配置简单、可增量 | hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=zk1:2181:/hbase <table> |
| Replication | 持续近实时同步 | 不停写 | 持续复制、运维简单 | add_peer '1','zkB:2181:/hbase'; alter 't',{NAME=>'cf',REPLICATION_SCOPE=>'1'}; start_replication |
| DistCp + Bulk Load | 离线大批量、可控窗口 | 需停写并 flush/disable | 极致吞吐、可控性强 | hadoop distcp hdfs://src/hbase/... hdfs://dst/hbase/...,生成 HFile 后 LoadIncrementalHFiles |
说明:
二、标准操作步骤
Export/Import(一次性全量)
hbase org.apache.hadoop.hbase.mapreduce.Export <table> /hdfs/path/exporthbase org.apache.hadoop.hbase.mapreduce.Import <table> /hdfs/path/exporthbase shell 中 scan '<table>', {LIMIT => 10} 或统计行数对比。ExportSnapshot(推荐,低影响)
snapshot 'snap', '<table>'hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snap -copy-to hdfs://dst-nn:8020/hbaserestore_snapshot 'snap';必要时执行 major_compact '<table>' 合并小文件。CopyTable(在线迁移/小中规模)
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=zk1:2181:/hbase <table>--starttime=... --endtime=...;按列族:--families=cf1,cf2。Replication(持续近实时)
hbase.replication=trueadd_peer '1','zkB:2181:/hbase'alter 't',{NAME=>'cf',REPLICATION_SCOPE=>'1'}status 'replication';追平后 stop_replication。DistCp + Bulk Load(离线大批量)
flush '<table>' 或 disable '<table>'hadoop distcp -m 50 hdfs://src/hbase/data/default/<table> hdfs://dst/hbase/data/default/<table>hbase org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2 \ -D hbase.table.name=<table> <hdfs_in> <hdfs_hfiles>hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs_hfiles> <table>hbase hbck。三、关键注意事项与最佳实践
版本与兼容性
一致性与窗口控制
性能与资源
-m、mapreduce.job.maps)、合理设置 hbase.client.scanner.caching;避免预测执行导致重复写入。HDFS 与权限
文件与清理
校验与回滚
hbase hbck 修复 region 分配;保留回滚方案(快照/备份)。四、快速命令清单(可直接复制)
Export/Import
# 源端
hbase org.apache.hadoop.hbase.mapreduce.Export <table> /hdfs/export/<table>
# 目标端
hbase org.apache.hadoop.hbase.mapreduce.Import <table> /hdfs/export/<table>
ExportSnapshot
# 源端
snapshot 'snap_<table>', '<table>'
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot snap_<table> \
-copy-to hdfs://dst-nn:8020/hbase
# 目标端
restore_snapshot 'snap_<table>'
major_compact '<table>'
CopyTable
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=zkB:2181:/hbase \
-Dhbase.client.scanner.caching=500 \
<table>
Replication
# 目标端开启复制
hbase shell
> add_peer '1','zkB:2181:/hbase'
> alter 't',{NAME=>'cf',REPLICATION_SCOPE=>'1'}
> start_replication
> status 'replication'
DistCp + Bulk Load
# 1) flush/disable(视窗口而定)
hbase shell
> flush '<table>'
# > disable '<table>'
# 2) 拷贝 HFiles
hadoop distcp -m 50 \
hdfs://src-nn:8020/hbase/data/default/<table> \
hdfs://dst-nn:8020/hbase/data/default/<table>
# 3) 生成 HFile(示例)
hbase org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2 \
-D hbase.table.name=<table> \
/hdfs/export/<table> /hdfs/hfiles/<table>
# 4) 导入
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
/hdfs/hfiles/<table> <table>
# 5) 校验
hbase hbck