Hbase BulkLoad Snapshot On Table

博客围绕主从集群replication双写下全量数据snapshot导入新集群表的问题展开。介绍了cdh6以下和以上hbase版本的不同导入方案,如cdh6以下有clone_snapshot + copyTable和bulkload,cdh6以上bulkload可整表导入但有文件个数限制。还说明了CDH6以上支持整表bulkload操作的源码查看及低版本支持loadtable功能的方法。

一:目的:

主从集群replication双写下,为了不影响增量数据,将全量数据snapshot导入新集群表中

二:方案:

2.1 .cdh6以下hbase版本:

方案一:clone_snapshot +copyTable(整表执行,操作次数少;操作时间长;copy Table会影响到正常读写,由于region的split)
方案二:bulkload ,但是受region个数与列族个数影响,操作次数太多,不方便(优点就是快,因为没有写hbase那些流程,直接复制的HFILE文件)

2.2 cdh6以上hbase版本

方案:bulkload可以整表HFile导入,解决了CDH6以下的操作频繁问题;
缺点就是:操作时,HFile文件个数受限制,默认最大32;需要修改参数:hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily,如果参数修改不起作用,就修改源码,重新打hbase-server-xxx.jar吧。

三:CDH6以上如何支持整表bulkload操作:

3.1 首先查看CDH5.9源码实现:

类路径:hbase-server包下org.apache.hadoop.hbase.mapreduce下面

@Override
public int run(String[] args) throws Exception {
    //因为没有loadtable参数,所以不会有三个参数的判断
  if (args.length != 2) {
    usage();
    return -1;
  }

  initialize();
//第一个参数是路径,也就是region的路径
  String dirPath = args[0];
  TableName tableName = TableName.valueOf(args[1]);

  boolean tableExists = this.doesTableExist(tableName);
  if (!tableExists) {
    if ("yes".equalsIgnoreCase(getConf().get(CREATE_TABLE_CONF_KEY, "yes"))) {
      this.createTable(tableName, dirPath);
    } else {
      String errorMsg = format("Table '%s' does not exist.", tableName);
      LOG.error(errorMsg);
      throw new TableNotFoundException(errorMsg);
    }
  }

  Path hfofDir = new Path(dirPath);

  try (Connection connection = ConnectionFactory.createConnection(getConf());
      HTable table = (HTable) connection.getTable(tableName);) {
    //执行操作
    doBulkLoad(hfofDir, table);
  }
  return 0;
}

3.2 CDH6.2判断源码实现:

类路径:hbase-server包下面org.apache.hadoop.hbase.tool,旧路径代码已经建议弃用了类路径

@Override
public int run(String[] args) throws Exception {
//参数判断
    if (args.length != 2 && args.length != 3) {
    usage();
    return -1;
  }
  //获取参数中的路径
  String dirPath = args[0];
  TableName tableName = TableName.valueOf(args[1]);

  //非loadtable
  if (args.length == 2) {
    return !run(dirPath, tableName).isEmpty() ? 0 : -1;
  } else {//loadtable
  //loadtable操作下一级目录region的遍历
    Map<byte[], List<Path>> family2Files = Maps.newHashMap();
    FileSystem fs = FileSystem.get(getConf());
    for (FileStatus regionDir : fs.listStatus(new Path(dirPath))) {
      FSVisitor.visitRegionStoreFiles(fs, regionDir.getPath(), (region, family, hfileName) -> {
        Path path = new Path(regionDir.getPath(), new Path(family, hfileName));
        byte[] familyName = Bytes.toBytes(family);
        if (family2Files.containsKey(familyName)) {
          family2Files.get(familyName).add(path);
        } else {
          family2Files.put(familyName, Lists.newArrayList(path));
        }
      });
    }
    return !run(family2Files, tableName).isEmpty() ? 0 : -1;
  }
}

3.3 在低版本中支持loadtable功能:

只能修改源码,加入三级目录判断。然后再遍历导入bulkload HFile.

<think>好的,我现在需要回答用户关于HBase数据迁移方法及工具的问题。首先,我要回忆一下HBase的数据迁移有哪些常用方式,并结合用户提供的引用内容来组织答案。 用户提供的引用中提到了Export/Import、CopyTableBulkLoad等方法,还有通过生成meta信息的方式。我需要将这些方法逐一整理,说明它们的原理、步骤和适用场景。 首先,Export/Import工具是HBase自带的,通过MapReduce导出数据为HDFS上的SequenceFile,再导入到新集群。这种方法适合全量迁移,但可能需要停机,因为导出期间数据可能有变动。引用4和引用3都提到了Export和Import的命令示例,需要引用这些内容。 接下来是CopyTable工具,它可以在集群间复制数据,支持时间范围和表的部分列族复制。引用5给出了CopyTable的命令格式,这里需要解释它的使用场景,比如增量迁移或跨集群复制。 BulkLoad方法适合大规模数据导入,生成HFile后直接加载到HBase,避免写入压力。引用2详细描述了BulkLoad的步骤,包括设置环境变量和执行completebulkload命令,这部分需要详细说明,并引用相关步骤。 快照方式也是常用的,通过创建快照并导出到新集群,再恢复数据。这种方法效率高,对在线服务影响小,但需要确认HBase版本是否支持。虽然用户提供的引用中没有直接提到快照,但根据我的知识,这也是一个重要的方法,可能需要补充进去。 另外,用户引用1提到了生成meta信息的方法,通过add_table.rb脚本,这可能是在特定情况下手动恢复元数据的情况,需要说明其使用场景和注意事项。 在整理这些方法时,需要注意每种方法的优缺点,比如Export/Import对集群的影响,BulkLoad的高效性,快照的快速恢复等。同时,引用用户提供的命令示例来增强答案的可信度,比如引用2中的BulkLoad命令和引用4中的Export/Import命令。 最后,用户可能关心如何选择合适的方法,需要根据数据量、停机时间、集群状况等因素给出建议。例如,全量迁移用Export/Import或BulkLoad,增量用CopyTable,在线服务用快照等。 在生成相关问题的时候,需要围绕迁移工具的选择、注意事项、增量迁移实现、数据验证以及跨版本迁移的问题展开,这样可以帮助用户进一步了解相关内容。 需要检查是否所有引用都被正确引用,比如引用1、2、3、4、5中的内容是否在回答中有对应的标注,确保每个方法的描述都引用了正确的来源。同时,确保使用中文回答,数学公式和代码块格式正确,但在这个问题中可能涉及较少数学公式,主要注意代码块的格式是否正确,如命令示例是否用反引号包裹。 总结步骤: 1. 分点列出每种迁移方法,包括原理、步骤、适用场景。 2. 结合用户提供的引用内容,引用对应的命令和步骤。 3. 比较不同方法的优缺点,给出选择建议。 4. 生成相关问题,帮助用户深入理解。</think>### HBase数据迁移方法及工具详解 HBase数据迁移可通过以下五种主流方法实现,根据迁移场景选择合适工具: --- #### 1. **Export/Import工具**(全量迁移) - **原理**:通过MapReduce任务将表数据导出为HDFS上的SequenceFile文件,再导入目标集群[^4]。 - **命令示例**: ```bash # 导出数据 hbase org.apache.hadoop.hbase.mapreduce.Export tableName hdfs://sourceIP/path # 导入数据 hbase org.apache.hadoop.hbase.mapreduce.Import tableName hdfs://targetIP/path ``` - **适用场景**:离线全量迁移,允许短暂停机[^3]。 - **缺点**:导出期间新写入数据可能丢失。 --- #### 2. **CopyTable工具**(跨集群复制) - **原理**:直接通过HBase客户端跨集群复制数据,支持增量迁移[^5]。 - **命令示例**: ```bash hbase org.apache.hadoop.hbase.mapreduce.CopyTable \ --peer.adr=zk1,zk2,zk3:/hbase \ --starttime=16000000 --endtime=17000000 \ 'sourceTable' ``` - **参数说明**: - `--peer.adr`:目标集群Zookeeper地址 - `--starttime/endtime`:时间范围过滤 - `--families`:指定列族 - **适用场景**:跨集群复制、增量迁移[^5]。 --- #### 3. **BulkLoad工具**(海量数据高效导入) - **原理**:将数据预生成HFile文件,直接加载到RegionServer,绕过Write-Ahead-Log[^2]。 - **步骤**: 1. 生成HFile文件(需符合目标表结构) 2. 执行加载命令: ```bash export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` hadoop jar hbase-server.jar completebulkload hdfs://path/hfiles tableName ``` - **优势**:吞吐量高,适合TB级数据迁移[^2]。 --- #### 4. **快照迁移**(低影响在线迁移) - **原理**:利用HBase快照功能创建元数据指针,导出快照文件后恢复。 - **步骤**: ```bash # 源集群创建快照 hbase snapshot create 'snapshot1' -t 'tableName' # 导出到HDFS hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot snapshot1 \ -copy-to hdfs://targetIP/hbase # 目标集群恢复 hbase shell > clone_snapshot 'snapshot1', 'newTable' ``` - **优势**:无需停机,秒级完成元数据操作。 --- #### 5. **手动重建元数据**(紧急恢复) - **适用场景**:数据文件已存在但Meta表损坏时。 - **操作步骤**: ```bash # 使用add_table.rb脚本重建Meta hbase org.jruby.Main add_table.rb hdfs://clusterIP/hbase/tableDir ``` - **注意**:需严格校验Region边界信息[^1]。 --- ### ░ 方法对比与选型建议 | 方法 | 数据量 | 停机需求 | 复杂度 | 适用场景 | |---------------|----------|----------|--------|-----------------------| | Export/Import | 中小 | 需要 | 低 | 离线全量迁移 | | BulkLoad | 超大 | 不需要 | 中 | 初始化导入/历史数据 | | CopyTable | 中小 | 不需要 | 低 | 增量同步/跨集群复制 | | 快照 | 任意 | 不需要 | 中 | 在线业务迁移 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈文摩尔ST

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值