3

有没有一种有效的方法可以在同一个集群中在 HBase 中创建表结构+数据的副本?显然目标表会有不同的名称。到目前为止我发现了什么:

  1. CopyTable 作业,已被描述为用于在不同HBase 集群之间复制数据的工具。我认为它会支持集群内操作,但不知道它是否旨在有效地处理这种情况。

  2. 使用导出+导入作业。这样做听起来像是一种 hack,但由于我是 HBase 的新手,也许这可能是一个真正的解决方案?

你们中的一些人可能会问我为什么要这样做。我的情况是我有数百万个需要访问的对象,如果你愿意的话,它们处于“快照”状态。有一个每天运行的批处理过程会更新其中的许多对象。如果该批处理过程中的任何步骤失败,我需要能够“回滚”到原始状态。不仅如此,在批处理过程中,我还需要能够将请求服务到原始状态。

因此,当前流程是我将原始表复制到工作副本,在更新工作副本时继续使用原始表服务请求。如果批处理成功完成,我会通知我的所有服务使用新表,否则我会丢弃新表。

使用 BDB 效果很好,但我现在处于一个真正大数据的全新世界,所以我可能采取了错误的方法。如果有人对我应该使用的模式有任何建议,他们非常受欢迎。:-)

4

1 回答 1

1

HBase 中的所有数据都有一定的时间戳。您可以使用一个参数进行读取(Gets 和 Scans),该参数指示您想要到给定时间戳的最新版本的数据。您可以做的一件事是使用指向批处理开始之前的时间的此参数进行读取以服务您的请求。批处理完成后,将您的读取时间戳提升到当前状态。

如果您采用这种方法,需要注意以下几点:

  • HBase 表被配置为存储给定单元格的最新 N 个版本。如果你用 N 个新值覆盖单元格中的数据,那么在下一次压缩期间你将丢失旧值。(您也可以将它们配置为使用 TTL 来使单元格过期,但这听起来不太符合您的情况)。
  • 同样,如果您将数据作为流程的一部分删除,那么您将无法在下一次压缩后读取它。

因此,如果您没有在批处理过程中发出删除操作,并且您写入的表中已经存在的相同数据的版本不超过您配置的要保存的版本,那么您可以继续为旧请求提供服务您正在更新的同一张表。这有效地为您提供了快照。

于 2010-08-27T22:01:18.763 回答