我有几个表,这些表由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 发送一条消息,告诉它推迟直到它完成它的事情。
我将这个问题视为"如何在表具有流式更新时安全地发展表架构"。
受架构更改影响的组件:
- 数据流流应用程序(或一般的流源(
- 大查询表(流式处理目标(
- 表的用户
我建议在下面做,以便将架构从 V1 迁移到 V2
组件
- 版本化数据流应用
- 版本控制大查询表
- (可选(为了最大程度地减少对用户的影响,使用 BigQuery 视图隐藏版本化表详细信息
迁移步骤
- (前步骤(准备好/测试一个 MERGE 命令,该命令将数据从 V1 表合并到 V2 表。
- 将数据流应用切换到 V2 并写入新的 V2 表。
- 运行 MERGE 命令,完成从 V1 表到 V2 表的数据迁移。
- (如果使用视图(更新视图以指向 V2 表。
- 验证完成后删除 V1 表。
考虑回滚的迁移步骤
- (前步骤(准备好/测试一个 MERGE 命令,该命令将数据从 V1 表合并到 V2 表。
- 让数据流应用 V1 同时写入 V1 表,V2 写入新的 V2 表。
- 运行 MERGE 命令,完成从 V1 表到 V2 表的数据迁移。
- 验证:良好 ,停止数据流应用 V1 并删除表 V1。
- 验证:错误: 停止数据流应用 V2 并删除表 V2。
- (如果使用视图(更新视图以指向 V2 表。