google dataflow BQ/BT Write atomic 每个作业?

Is google dataflow BQ/BT Write atomic per job?

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

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

我知道写入 GCS 似乎不是原子的,当作业 运行 时,会沿途产生部分输出分区。

不过,我已经尝试通过数据流将数据转储到 BQ 中,似乎输出 table 不会暴露给用户,直到作业声称成功。

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

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

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

不过,需要明确的是,BigQuery 在 BigQuery 作业级别是原子的,而不是在可能创建 BigQuery 作业的数据流作业级别。例如。如果您的 Dataflow 作业失败但它在失败之前已写入 BigQuery(并且该 BigQuery 作业已完成),则数据将保留在 BigQuery 中。

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

  1. 将所有数据写入 GCS 上的临时目录。
  2. 使用包含要写入的行的所有临时文件的显式列表发出 BigQuery load 作业。

如果 GCS 写入仅部分完成时出现故障,我们将在重试时重新创建临时文件。第 1 步将生成一份完整的数据副本,并用于第 2 步中的加载,否则作业将在第 2 步之前失败。

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

为了更深入一点,Dataflow 还使用确定性 BigQuery job id(如 dataflow_job_12423423),因此如果监控加载作业的 Dataflow 代码失败并重试,我们仍然会使用 exactly-once将语义写入 BigQuery。

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

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