如何在同一群集上的HBase中创建表的副本?或者,如何在工作状态下操作时使用原始状态提供请求

时间:2010-08-17 16:16:51

标签: java database web-services hbase

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

  1. CopyTable作业,已被描述为在不同 HBase集群之间复制数据的工具。我认为它将支持集群内部操作,但不知道它是否被设计为有效地处理该场景。

  2. 使用导出+导入作业。这听起来像是一个黑客,但因为我是HBase的新手,这可能是一个真正的解决方案吗?

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

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

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

1 个答案:

答案 0 :(得分:1)

HBase中的所有数据都有一定的时间戳。您可以使用一个参数进行读取(获取和扫描),该参数指示您希望在给定时间戳内获得最新版本的数据。您可以做的一件事是使用此参数指向批处理开始之前的时间来执行读取以处理您的请求。批处理完成后,将读取时间戳提升到当前状态。

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

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

因此,如果您不在批处理过程中发出删除操作,并且您没有编写表格中已存在的相同数据的更多版本,而不是将其配置为保存,则可以继续投放您正在更新的同一个表中的旧请求。这有效地为您提供了快照。