apache-spark - GCP 上的数据湖、图层和 ETL 处理
问题描述
我来自本地/hadoop 数据平台背景,现在想了解在 GCP 云技术上执行此操作的良好实践。
如图所示,我使用 HDFS/Hive 来存储所有 3 层的数据:“Landing”、“Cleansed”和“Processed”。对于 ETL 流程,我使用了 Spark。它还支持不同的摄取模式:插入新记录、插入以及更新以前的数据。
对于“服务层”,我们使用了 Presto。此外,使用 DeltaLake 等新技术,可以保持几乎相同的架构以统一的方式支持流式处理和批处理。
在 GCP 上,我可以想到以下选项:
选项1:
- “登陆层”是谷歌存储。
- DataFlow“ETL 流程”将数据转换并加载到“Cleansed Layer”中。“Cleansed Layer”存储为 BigQuery 表。
- “清理层”到“处理层”ETL 在 BigQuery 内部完成
选项 2:
- “登陆层”是谷歌存储。
- DataFlow/DataProc“ETL流程”将数据转换并存储在“Cleansed Layer”中。“Cleansed Layer”存储在Cloud Store中。
- “清理层”到“处理层”ETL 使用 DataFlow/DataProc 完成,“处理层”也在 Cloud Store 中。
- “服务层”是 BigQuery 表。BigQuery 加载的“处理层”是通过对 BigQuery 性能的非规范化来完成的。
我的问题:
- 如选项 1 中所述:在 BigQuery 本身内部执行 ETL 是一种好习惯吗?(使用 BQ DML 语句)。我的印象是不应该在 BQ 中完成繁重的 ETL,因为它不是为大量数据突变而设计的。
- 在选项 2 中:如果数据摄取模式仅插入,则可以使用 b'q load' 完成 BigQuery 加载的“已处理层”。如果我们必须更新以前的数据怎么办?在这种情况下如何使用 bq-load,因为它只支持追加和替换/覆盖模式。替换一个大表只是为了更新它的一部分记录是不高效的。
- 进行 ETL 和处理 BQ 表更新的一般良好做法是什么?
解决方案
推荐阅读
- javascript - 两个相同的对象,当一个对象改变一个值时,另一个对象也会改变
- swift - Swiftui 向下滑动以关闭纵向而不是横向的模态作品
- python - 用 numpy 向量化 for 循环
- r - 有没有办法从保存为 RDATATMP 文件的工作区图像中恢复数据帧?
- azure - 在 Azure 数据工厂复制管道中使用管道参数
- java - Java 记录和空对象模式?
- scala - 如何提取列值以与火花数据框中的 rlike 进行比较
- ios - CLLLocationManager 并将位置更新传递到应用程序的不同部分
- tensorflow - TensorFlow:如何提供不适合内存的数据集?
- javascript - 文件输出流 Java