谷歌数据流BQ / BT每个工作写原子?

时间:2016-08-05 22:21:16

标签: google-cloud-dataflow

也许我是一个糟糕的寻求者,但我无法在文档中找到答案,所以我只想在这里试试运气

所以我的问题是说我有一个写入BigQuery或BigTable的数据流作业,但作业失败了。数据流是否能够在开始之前回滚到状态,或者我的表中可能只有部分数据?

我知道写入GCS似乎不是原子的,在作业运行的过程中会产生部分输出分区。

但是,我尝试通过数据流将数据转储到BQ中,并且在作业声称成功之前,输出表似乎不会向用户公开。

3 个答案:

答案 0 :(得分:3)

在批处理中,Cloud Dataflow对BigQueryIO.Write.to("some table")使用以下过程:

  1. 将所有数据写入GCS上的临时目录。
  2. 发出一个BigQuery load作业,其中包含所有包含要写入的行的临时文件的显式列表。
  3. 如果GCS写入仅在部分完成时出现故障,我们将在重试时重新创建临时文件。步骤1中将生成一个完整的数据副本,并在步骤2中用于加载,或者在步骤2之前作业将失败。

    每个BigQuery load工作,如William V的答案,都是原子的。 load作业将成功或失败,如果失败,则不会向BigQuery写入数据。

    稍微深一点,Dataflow还使用确定性BigQuery job id(如dataflow_job_12423423),这样如果监视加载作业的Dataflow代码失败并重试,我们仍然会有一次写入语义到BigQuery。

    这种设计一起意味着管道中的每个BigQueryIO.Write变换都是原子的。在一个常见的情况下,您的工作中只有一个这样的写入,因此如果作业成功,数据将在BigQuery中,如果作业失败,则不会写入数据。

    但是:请注意,如果管道中有多个 BigQueryIO.Write转换,则在Dataflow作业失败之前,某些写入可能已成功完成。当Dataflow作业失败时,不会还原已完成的写入。    这意味着在重新运行具有多个接收器的Dataflow管道时可能需要小心,以确保存在来自早期失败作业的提交写入的正确性。

答案 1 :(得分:1)

我可以代表Bigtable。 Bigtable在行级别是原子级,而不是在作业级别。部分失败的Dataflow作业会将部分数据写入Bigtable。

答案 2 :(得分:1)

BigQuery作业失败或成功。来自https://cloud.google.com/bigquery/docs/reference/v2/jobs

每个操作都是原子操作,只有在BigQuery能够成功完成作业时才会发生。作业完成时,创建,截断和追加操作将作为一个原子更新发生。

但是,为了清楚起见,BigQuery在BigQuery作业级别是原子级的,而不是可能创建BigQuery作业的Dataflow作业级别。例如。如果您的Dataflow作业失败但在失败之前已写入BigQuery(并且该BigQuery作业已完成),那么数据将保留在BigQuery中。