温馨提示×

Ubuntu HBase如何进行数据迁移

小樊
34
2025-12-28 11:38:10
栏目: 智能运维

Ubuntu 环境下 HBase 数据迁移实操指南

一、迁移方案速览与选型

  • CopyTable:基于 MapReduce 在表级别复制数据,适合中小规模、需要在线或近实时迁移的场景;对源集群有一定读写压力。支持按时间范围增量同步。
  • Export/Import:先 Export 为 SequenceFile 到 HDFS,再 Import 到目标表;适合跨版本迁移或需要中间产物审计/留存的场景。
  • DistCp + hbck:直接拷贝底层 HDFS 表目录,再用 hbck 修复元数据与分配;适合停机或低峰窗口的大表迁移。
  • Snapshot + ExportSnapshot:对在线业务影响最小,快照元数据拷贝后通过 MR 搬运底层 HFile;推荐用于生产环境、TB 级数据迁移。
  • Replication:配置主从复制,持续同步增量;适合长期双活/准实时同步,非一次性迁移。
  • 异构导入(如 MySQL→HBase)可用 Sqoop/DataX 等工具,本文聚焦 HBase↔HBase。

二、标准操作步骤

  • Snapshot + ExportSnapshot(推荐)

    1. 源集群创建快照
      hbase shell> snapshot ‘tableA’, ‘tableA_snap’
    2. 导出快照到目标集群 HDFS(MR 并行拷贝 HFile)
      hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot
      -snapshot tableA_snap
      -copy-from hdfs://src-nn:8020/hbase
      -copy-to hdfs://dst-nn:8020/hbase
      -mappers 16 -bandwidth 100 -overwrite
    3. 目标集群恢复
      hbase shell> disable ‘tableA’
      hbase shell> restore_snapshot ‘tableA_snap’
      hbase shell> enable ‘tableA’
    4. 可选:合并小文件,降低文件数
      hbase shell> major_compact ‘tableA’
      说明:大表建议加 -skip.tmp=true,避免引用临时目录被清理导致 FileNotFound。
  • DistCp + hbck(停机/低峰窗口)

    1. 源集群刷盘并(建议)停用表
      hbase shell> flush ‘tableA’
      hbase shell> disable ‘tableA’
    2. 拷贝表目录到目标集群临时目录
      hadoop distcp -m 100 -bandwidth 200
      hdfs://src-nn:8020/hbase/data/default/tableA
      hdfs://dst-nn:8020/tmp/hbase/tableA
    3. 目标集群将目录移入 HBase 根目录并修复
      sudo -u hbase hdfs dfs -mv /tmp/hbase/tableA /hbase/data/default/tableA

    如使用 HBCK2(HBase 2.x+ 推荐)

    sudo -u hbase hbase hbck -j /opt/hbase-hbck2/hbase-hbck2-1.1.0.jar
    addFsRegionsMissingInMeta default:tableA
    sudo -u hbase hbase hbck -j /opt/hbase-hbck2/hbase-hbck2-1.1.0.jar assigns default:tableA
    4) 校验
    hbase shell> count ‘tableA’
    说明:老版本可用 hbck -fixMeta -fixAssignments;HBase 2.x 起更推荐 HBCK2

  • CopyTable(在线迁移/小中规模)

    1. 目标集群先建同名同结构表(列族一致)
      hbase shell> create ‘tableA’, {NAME => ‘cf’, VERSIONS => 3}
    2. 可选:降低业务影响(只读或停写窗口)
      hbase shell> flush ‘tableA’
    3. 全量拷贝
      hbase org.apache.hadoop.hbase.mapreduce.CopyTable
      –peer.adr=dst-zk:2181:/hbase tableA
    4. 增量同步(按时间窗口)
      hbase org.apache.hadoop.hbase.mapreduce.CopyTable
      –peer.adr=dst-zk:2181:/hbase
      –starttime=1672531200000 --endtime=1672617600000 tableA
    5. 校验
      hbase shell> count ‘tableA’
      说明:可按需调节 -Dhbase.client.scanner.caching、并发与带宽参数。
  • Export/Import(跨版本/可审计中间产物)

    1. 源集群导出
      hbase org.apache.hadoop.hbase.mapreduce.Export tableA
      hdfs://dst-nn:8020/export/tableA
    2. 目标集群先建表(列族一致)
      hbase shell> create ‘tableA’, {NAME => ‘cf’, VERSIONS => 3}
    3. 目标集群导入
      hbase org.apache.hadoop.hbase.mapreduce.Import tableA
      hdfs://dst-nn:8020/export/tableA
    4. 校验
      hbase shell> count ‘tableA’
      说明:适合跨版本或需要保留导出文件的场景。

三、迁移前后校验与常见问题

  • 校验清单
    • 行数对比:count ‘tableA’;抽样对比:scan ‘tableA’, {LIMIT => 1000}
    • 表结构:describe ‘tableA’ 检查列族与版本数。
    • Region 健康:hbase hbck(或 HBCK2)检查 REGION_IN_TRANSITION、空洞等。
  • 常见问题与处理
    • 目标表不存在或列族不匹配:先按源表结构创建目标表。
    • 元数据不一致:使用 hbck -fixMeta / -fixAssignmentsHBCK2 addFsRegionsMissingInMeta + assigns
    • 大表快照导出慢或失败:加 -mappers-bandwidth,并使用 -skip.tmp=true 避免引用临时目录被清理。
    • 迁移期间业务抖动:优先选择 Snapshot;CopyTable 建议在低峰或只读窗口执行;必要时分批次迁移。

四、方法对比与适用场景

方法 业务影响 适用规模 跨版本 关键优点 关键限制
Snapshot + ExportSnapshot 极小 中~大 在线、速度快、一致性好 需 HDFS 互通与权限
DistCp + hbck 需停写/低峰 简单直接、适合一次性大迁移 需停机或严格窗口
CopyTable 中(全表扫描) 小~中 配置简单、可增量 对源集群有压力
Export/Import 小~中 中间产物可审计、跨版本友好 需额外存储与两次作业
Replication 持续同步 准实时、长期同步 非一次性迁移、配置复杂

0