温馨提示×

hbase数据迁移ubuntu上怎么实现

小樊
43
2026-01-01 09:33:13
栏目: 智能运维

在 Ubuntu 上迁移 HBase 数据的常用做法

  • 离线全量迁移(Export/Import):跨集群、跨机房、跨版本都较稳妥,适合一次性搬迁或定期备份恢复。
  • 表级文件拷贝(HDFS 直拷 + hbck 修复):同版本、同 HDFS 布局时最快,适合整库/整表搬迁。
  • 文本/CSV 导入(ImportTsv):从关系型数据库导出为 TSV/CSV 后导入,适合小规模或特定格式数据。
  • 生成 HFile 再批量导入(ImportTsv → LoadIncrementalHFiles):近实时批量导入、对线上影响小,适合大表增量装载。

方案一 离线全量迁移 Export/Import(推荐)

  • 步骤
    1. 在源集群导出表到 HDFS
      • 基本用法:hbase org.apache.hadoop.hbase.mapreduce.Export <表名> <HDFS导出目录>
      • 常用参数:
        • 时间窗: -D hbase.mapreduce.scan.starttime=<ts> -D hbase.mapreduce.scan.endtime=<ts>
        • 版本数: -D hbase.mapreduce.scan.versions=<N>
        • 列族: -D hbase.mapreduce.scan.column.family=<cf1,cf2>
        • 压缩(若集群未装 Snappy,可改用 Gzip):
          -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec
    2. 将导出目录从源 HDFS 复制到目标 Ubuntu 的 HDFS(同集群可跳过)
      • hdfs dfs -get <HDFS导出目录> /tmp/exported_table
      • hdfs dfs -put /tmp/exported_table <目标HDFS目录>
    3. 在目标集群用 HBase Shell 先建表(列族、TTL、压缩等需与源表一致)
      • create '<表名>', {NAME => '<cf1>', ...}
    4. 在目标集群导入
      • 直接导入:hbase org.apache.hadoop.hbase.mapreduce.Import <表名> <目标HDFS目录>
      • 若想先生成 HFile 再批量导入(对线上更友好):
        • 生成 HFile:hbase org.apache.hadoop.hbase.mapreduce.Import -Dimport.bulk.output=<HFile输出目录> <表名> <目标HDFS目录>
        • 批量导入:hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <HFile输出目录> <表名>
    5. 校验
      • hbase shell 中执行:scan '<表名>', {LIMIT => 10}count '<表名>' 抽样核对数据量。
  • 说明
    • Export/Import 是 HBase 官方提供的 MapReduce 工具,适合跨集群迁移;可控制时间范围、版本、列族等,且支持生成 HFile 做批量加载。

方案二 表级文件拷贝(HDFS 直拷 + hbck 修复)

  • 适用前提
    • HBase 版本一致HDFS 兼容、表结构一致;适合整库/整表搬迁或快速恢复。
  • 步骤
    1. 在源 HDFS 上拷贝表目录到目标 HDFS(示例表名为 china_webpage
      • hdfs dfs -get hdfs://<源NN>:<端口>/hbase/data/default/china_webpage /tmp/china_webpage
      • hdfs dfs -put /tmp/china_webpage hdfs://<目标NN>:<端口>/hbase/data/default/
    2. 修复 metaregion 分配
      • hbase hbck -fixMeta
      • hbase hbck -fixAssignments
    3. 校验
      • hbase shellscan 'china_webpage', {LIMIT => 10} 验证。
  • 说明
    • HBase 表数据默认位于 /hbase/data/default/<表名>(或命名空间目录);拷贝后需通过 hbck 重新建立 meta 与 region 映射并分配。

方案三 文本/CSV 导入(ImportTsv)

  • 适用场景
    • 已有 TSV/CSV 数据(如从 MySQL 导出),或需要按文本规则导入少量数据。
  • 步骤
    1. 准备数据文件(示例 data.txt):
      • 内容示例:1,tom,m
    2. 上传到 HDFS:
      • hdfs dfs -put data.txt /user/hbase/import/data.txt
    3. 在 HBase Shell 建表:
      • create 'testtable4','cf1','cf2'
    4. 直接导入:
      • hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=',' -Dimporttsv.columns=HBASE_ROW_KEY,cf1,cf2 testtable4 /user/hbase/import/data.txt
    5. 校验:
      • scan 'testtable4', {LIMIT => 10}
  • 说明
    • ImportTsv 适合小规模或规则文本数据导入;若数据量大,建议走 生成 HFile → LoadIncrementalHFiles 的批量方式。

方案四 生成 HFile 再批量导入(近实时批量装载)

  • 适用场景
    • 大表批量导入、对线上写入影响要尽可能小。
  • 步骤
    1. 用 ImportTsv 生成 HFile:
      • hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=',' -Dimporttsv.columns=HBASE_ROW_KEY,cf1,cf2 -Dimporttsv.bulk.output=/user/hbase/hfile_tmp testtable4 /user/hbase/import/data.txt
    2. 批量导入 HFile:
      • hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/hbase/hfile_tmp testtable4
    3. 校验:
      • scan 'testtable4', {LIMIT => 10}
  • 说明
    • 先生成 HFile(本质是 HDFS 上的有序文件),再通过 LoadIncrementalHFiles 快速加载到目标表,通常比直接 Import 更快、对 Region 扰动更小。

迁移前后关键注意事项

  • 版本与兼容性
    • 跨大版本迁移(如 1.x → 2.x)优先用 Export/Import;同版本优先 HDFS 直拷 + hbck
  • 表结构一致性
    • 列族名、列族属性(如 BLOCKSIZE/COMPRESSION/TTL)、命名空间需一致;否则需在建表时对齐。
  • 时间与版本控制
    • 用 Export 的 starttime/endtime/versions 精确控制迁移窗口,避免漏导或重复。
  • 压缩与编解码
    • 若未安装 Snappy,导出时改用 Gzip 以避免运行时依赖问题。
  • 校验与回滚
    • 迁移后务必做 抽样 Scan/Count 校验;保留导出目录一段时间以便回滚。
  • 资源与窗口
    • 大数据量迁移选择业务低峰期,合理设置 MR 并发、内存、带宽,避免影响线上。

以上方案在 Ubuntu 上均可直接执行(前提是已安装并配置好 Hadoop/HBase 环境,且 HDFS 可达)。根据数据规模、网络条件与停机窗口选择最合适的一种或组合使用。

0