如何以原子方式手动修改 BQ 表架构?



我有几个表,这些表由GCP DataFlow流应用程序填充,作为某些数据管道的一部分(它是DataFlow的事实在这里并不那么相关,除了它在流模式下半定期填充的事实(。这些表由依赖于表名称的下游进程使用。

我需要以生产化的方式发展这些表的架构。根据 BQ 文档建议 (https://cloud.google.com/bigquery/docs/manually-changing-schemas#option_2_exporting_your_data_and_loading_it_into_a_new_table(,我打算将当前表以 AVRO 格式导出到 GCS,然后基于新的向后兼容模式创建一个新表*,最后将 AVRO 导出加载到新表中,然后覆盖原始表。

* 我创建一个新表而不是写在同一表上的原因是因为,在"更新"实际表之前,我需要确保此操作在我正在协调此架构演变的多个项目中成功。无论如何,我相信如果我尝试就地更新表格,我会遇到同样的问题。

问题所在

问题是在我的导出开始和加载完成之间,我的 DataFlow 应用程序可能已经更新了原始表(它以插入/覆盖分区方式工作(。这是一个问题,因为在我处理架构更改时,我将丢失这些数据。

如何在没有批处理事务/分布式事务/表锁的情况下安全地更新表架构?如上面的 * 块所述,我有额外的复杂性,需要使用间歇性表来确保我的操作在所有项目中工作,然后再将其处理到下游内容所依赖的表中。

我能想到的唯一选择是自定义实现我可以通过锁获得的行为 - 但通过合作。 即,我的模式更新过程可以向 DataFlow 发送一条消息,告诉它推迟直到它完成它的事情。

我将这个问题视为"如何在表具有流式更新时安全地发展表架构"。

受架构更改影响的组件:

  1. 数据流流应用程序(或一般的流源(
  2. 大查询表(流式处理目标(
  3. 表的用户

我建议在下面做,以便将架构从 V1 迁移到 V2

组件

  1. 版本化数据流应用
  2. 版本控制大查询表
  3. (可选(为了最大程度地减少对用户的影响,使用 BigQuery 视图隐藏版本化表详细信息

迁移步骤

  1. (前步骤(准备好/测试一个 MERGE 命令,该命令将数据从 V1 表合并到 V2 表。
  2. 将数据流应用切换到 V2 并写入新的 V2 表。
  3. 运行 MERGE 命令,完成从 V1 表到 V2 表的数据迁移。
  4. (如果使用视图(更新视图以指向 V2 表。
  5. 验证完成后删除 V1 表。

考虑回滚的迁移步骤

  1. (前步骤(准备好/测试一个 MERGE 命令,该命令将数据从 V1 表合并到 V2 表。
  2. 让数据流应用 V1 同时写入 V1 表,V2 写入新的 V2 表。
  3. 运行 MERGE 命令,完成从 V1 表到 V2 表的数据迁移。
  4. 验证:良好 ,停止数据流应用 V1 并删除表 V1。
  5. 验证:错误: 停止数据流应用 V2 并删除表 V2。
  6. (如果使用视图(更新视图以指向 V2 表。

最新更新