【问题标题】:Read spanner data from a table which is simultaneously being written从同时被写入的表中读取 spanner 数据
【发布时间】:2019-05-17 20:17:03
【问题描述】:

我正在通过 Dataflow 作业将 Spanner 数据复制到 BigQuery。该作业计划每 15 分钟运行一次。问题是,如果从同时写入的 Spanner 表中读取数据,则在复制到 BigQuery 时会丢失一些记录。

我在读取 Spanner 数据时使用了 readOnlyTransaction()。在进行此活动时,我还必须采取任何其他预防措施吗?

【问题讨论】:

  • 您能否提供有关数据流作业的更多信息?例如,它是否每 15 分钟以特定时间戳读取整个表,并写出所有数据?
  • 每15分钟读取一次最新数据。 DF 作业从上一次运行中获取 update_date > max(update_date) 'yyyy-mm-dd hh:mm;ss.SSS' 的数据。

标签: google-cloud-platform google-bigquery google-cloud-dataflow apache-beam google-cloud-spanner


【解决方案1】:

建议使用 Cloud Spanner 提交时间戳填充 update_date 等列。提交时间戳允许应用程序确定突变的确切顺序。

使用update_date 的提交时间戳并指定准确的时间戳读取,Dataflow 作业将能够找到自上次运行以来写入/提交的所有现有记录。

https://cloud.google.com/spanner/docs/commit-timestamp

https://cloud.google.com/spanner/docs/timestamp-bounds

【讨论】:

    【解决方案2】:

    如果从同时写入的 Spanner 表中读取数据,则在复制到 BigQuery 时会丢失一些记录

    这就是交易的运作方式。它们在创建事务时呈现数据库的“快照视图”,因此在拍摄此快照之后写入的任何行都将不包括在内。

    作为@rose-liu mentioned,在您的行上使用提交时间戳,并跟踪您上次导出时的时间戳(可从ReadOnlyTransaction object) 获得,将允许您准确选择“自上次导出以来的新/更新行”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2019-01-02
      • 2023-04-04
      相关资源
      最近更新 更多