首页 > 解决方案 > GCP 上的数据湖、图层和 ETL 处理

问题描述

在此处输入图像描述

我来自本地/hadoop 数据平台背景,现在想了解在 GCP 云技术上执行此操作的良好实践。

如图所示,我使用 HDFS/Hive 来存储所有 3 层的数据:“Landing”、“Cleansed”和“Processed”。对于 ETL 流程,我使用了 Spark。它还支持不同的摄取模式:插入新记录、插入以及更新以前的数据。

对于“服务层”,我们使用了 Presto。此外,使用 DeltaLake 等新技术,可以保持几乎相同的架构以统一的方式支持流式处理和批处理。

在 GCP 上,我可以想到以下选项:

选项1:

选项 2:

我的问题:

  1. 如选项 1 中所述:在 BigQuery 本身内部执行 ETL 是一种好习惯吗?(使用 BQ DML 语句)。我的印象是不应该在 BQ 中完成繁重的 ETL,因为它不是为大量数据突变而设计的。
  2. 在选项 2 中:如果数据摄取模式仅插入,则可以使用 b'q load' 完成 BigQuery 加载的“已处理层”。如果我们必须更新以前的数据怎么办?在这种情况下如何使用 bq-load,因为它只支持追加和替换/覆盖模式。替换一个大表只是为了更新它的一部分记录是不高效的。
  3. 进行 ETL 和处理 BQ 表更新的一般良好做法是什么?

标签: apache-sparkhadoopgoogle-cloud-platform

解决方案


有很多方法可以设计这个解决方案,这是我的建议:

在此处输入图像描述

数据湖:
将数据从源系统按原样加载到 BigQuery,因此数据库操作将只是 INSERT。

数据中心:
在这里,您可以维护 OLTP 结构,但实现渐变维度(Type-II)。
(A) 为所有新事务插入数据
(B) 为退出事务插入数据,也只更新操作列,如 END_DATE 和 ACTIVE_FLAG。因此,您可以维护记录的历史记录。

在此处输入图像描述

在此处输入图像描述

数据分析:
在这里,您可以使用像 Data Hub 这样的 SCD Type-II 构建维度建模,以最大限度地减少像 UPDATE 这样的大型 DML 操作


推荐阅读