Google bigquery BigQuery为查询作业提供了什么原子性保证?

Google bigquery BigQuery为查询作业提供了什么原子性保证?,google-bigquery,Google Bigquery,我正在调查我编写的一个定期运行的作业中的一个数据正确性问题,这个问题似乎是由BigQuery以非原子方式两次覆盖同一个表引起的。更具体地说,我在同一时间运行了同一查询的两个副本(由于重试逻辑),两个副本都设置为覆盖同一个表(使用WRITE_TRUNCATE选项),结果表的每一行都有两个副本。我希望一个查询用查询结果编写一个表,而另一个查询用相同的结果覆盖它,而不是以一个双倍大小的表结束 我在设计系统时的理解是,所有BigQuery操作都是原子的(基于、和)。我遇到的问题是一个bug,还是我误解了

我正在调查我编写的一个定期运行的作业中的一个数据正确性问题,这个问题似乎是由BigQuery以非原子方式两次覆盖同一个表引起的。更具体地说,我在同一时间运行了同一查询的两个副本(由于重试逻辑),两个副本都设置为覆盖同一个表(使用WRITE_TRUNCATE选项),结果表的每一行都有两个副本。我希望一个查询用查询结果编写一个表,而另一个查询用相同的结果覆盖它,而不是以一个双倍大小的表结束

我在设计系统时的理解是,所有BigQuery操作都是原子的(基于、和)。我遇到的问题是一个bug,还是我误解了我所能期望的确切保证

纵观历史,在过去的一周里,至少有4起案件发生了这种情况

以下是导致这种情况发生的时间线(具体细节适用于最引人注目的案例):

  • 大约在UTC 4月30日18:07,我的代码同时提交了82个查询。每一个查询一个以conversions_2014_04_30_14结尾的表和另一个表,并写入以conversions_2014_04_30_16结尾的表(指定WRITE_TRUNCATE)
  • 大约25分钟后,25个查询仍然没有完成(这比通常情况下要多),因此它触发了“重试”逻辑,放弃所有仍在运行的查询并再次提交它们(这是为了解决我看到的一个问题,即查询将在未运行的情况下等待数小时,我在这里提到:)。这意味着同时有50个查询未完成,25个查询中有两个尚未完成
  • 所有查询完成后,82个结果表中有6个表的大小是它们应该的两倍
  • 这里有一个例子:

    第一个查询作业:124072386181:job_tzqbfxfLmZv_qmyl6ozlqplg5u

    第二个查询作业:124072386181:job_j9_7uJEjtvYbyeVmEVP0u2er9Lk

    结果表:124072386181:bigbingo_history.video_task_partners_conversions_2014_04_30_16

    还有一个例子:

    第一个查询作业:124072386181:job_TQJzGabFT9FtHI05ftTkD5O8KKU

    第二个查询作业:124072386181:job_5hogbjnLX_5a2opejl9jacn53s

    表:124072386181:bigbingo_历史。项目重复_消除_转换_2014_04_27_16


    自从这些查询运行以来(除了第一个表的模式添加之外),这些表还没有被触及过,所以它们仍然包含重复的行。确认这一点的一种方法是查看所有查询都有“分组方式,bingo_id”,但每个表都有两个(可选方式,bingo_id)对。

    我们有一个错误,在某些情况下,写入截断可能会追加。我们昨天(5月22日)发布了修复程序,自那时以来,再也没有看到该问题的任何实例。

    对此有任何更新吗?我能够更改代码以提交更少的查询,这避免了触发此问题的奇怪重试逻辑的需要,但我相信我的代码仍然可以在发生某些罕见错误时提交查询的多个副本,所以WRITE_TRUNCATE必须是幂等的,我的代码才能100%正确。我们昨天隔离了这个问题并推出了一个修复方案。