温馨提示×

HBase数据迁移在CentOS上怎么做

小樊
34
2025-12-13 20:40:29
栏目: 智能运维

在 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

说明:

  • 云上或部分托管 HBase 默认不开放 HDFS 端口时,基于 HDFS 的 DistCp/Snapshot 可能不可用,可改用 CopyTable 或联系云厂商支持。

二、标准操作步骤

  • Export/Import(一次性全量)

    1. 源端导出:hbase org.apache.hadoop.hbase.mapreduce.Export <table> /hdfs/path/export
    2. 目标端导入:hbase org.apache.hadoop.hbase.mapreduce.Import <table> /hdfs/path/export
    3. 校验:hbase shellscan '<table>', {LIMIT => 10} 或统计行数对比。
  • ExportSnapshot(推荐,低影响)

    1. 源端创建快照:snapshot 'snap', '<table>'
    2. 导出快照到目标 HDFS:hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snap -copy-to hdfs://dst-nn:8020/hbase
    3. 目标端恢复:restore_snapshot 'snap';必要时执行 major_compact '<table>' 合并小文件。
  • CopyTable(在线迁移/小中规模)

    1. 目标端先建表(列族一致,建议按源表预分裂)
    2. 执行迁移:hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=zk1:2181:/hbase <table>
    3. 增量/按时间:--starttime=... --endtime=...;按列族:--families=cf1,cf2
  • Replication(持续近实时)

    1. 源/目标均开启复制:hbase.replication=true
    2. 添加复制对:add_peer '1','zkB:2181:/hbase'
    3. 打开表级复制:alter 't',{NAME=>'cf',REPLICATION_SCOPE=>'1'}
    4. 监控:status 'replication';追平后 stop_replication
  • DistCp + Bulk Load(离线大批量)

    1. 源端 flush/可选 disable:flush '<table>'disable '<table>'
    2. 拷贝 HFiles:hadoop distcp -m 50 hdfs://src/hbase/data/default/<table> hdfs://dst/hbase/data/default/<table>
    3. 生成 HFile(示例):
      hbase org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2 \ -D hbase.table.name=<table> <hdfs_in> <hdfs_hfiles>
    4. 导入:hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs_hfiles> <table>
    5. 校验与修复:hbase hbck

三、关键注意事项与最佳实践

  • 版本与兼容性

    • Export/Import 适合跨版本迁移;CopyTable/Replication 建议同版本或兼容版本使用。
  • 一致性与窗口控制

    • 尽量在业务低峰期操作;对在线表先 flush,大表迁移可 disable 后再拷贝;持续同步用 Replication 追平后切换。
  • 性能与资源

    • 提升 MapReduce 并行度(如 -mmapreduce.job.maps)、合理设置 hbase.client.scanner.caching;避免预测执行导致重复写入。
  • HDFS 与权限

    • 两集群间网络、端口(如 8020/9000/2181)、Kerberos/ACL 需互通;目标路径提前创建并赋权。
  • 文件与清理

    • 迁移完成后清理临时 HDFS 路径;快照/导出目录按策略保留;目标端导入后可 major_compact 减少小文件。
  • 校验与回滚

    • 迁移前后对比行数/校验和;使用 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
    

0