面试官居然问应届生数据湖架构
一、前言
上次有个同学跟我说字节面试居然问他懂不懂数据湖,现在大数据找工作已经卷到这种地步了吗
今天就来跟大家聊一聊数据湖
首先弄清楚数据湖是什么?
数据湖是一个集中式存储库,允许存储所有结构化和非结构化数据
这时候就会有人问,和数据仓库有什么区别?
即便说了这么多,可能你还是对数据湖的概念很模糊
那么我们来看一下数据仓库的问题:
- 我们只能增加字段,很难去下线一个字段,真的要下线某一个字段,风险非常高
- 数据更新的底层是把整个表的数据重新生成一遍,再覆盖掉历史数据,成本非常高
- 增删改没有事务性保障,而在传统的数据库中有成熟的一致性解决方案
- 索引功能是有限的,一般很少建立索引,3.0版本已经没有索引了
- 无法满足算法人员对数据的所有诉求,比如在机器学习场景中,需要一些文本、语音、视频等非结构化数据
- 流批一体开发周期长,当下最流行的流批一体开发模式是基于lambda架构的,这种模式需要同时进行离线和实时的单独开发。
数据湖的提出正好解决了上述大部分问题,数据湖主要有以下特性
- 能够存储海量的原始数据
- 能够支持任意数据格式的数据
- 有较好的分析和处理能力
目前数据湖的相关产品主要有 Delta Lake、Apache Iceberg和Apache Hudi
下面我分别介绍一下这三个数据湖的关键特性:
Delta Lake
1、ACID事务:通过不同等级的隔离策略,Delta Lake 支持多个 pipeline 的并发读写;
2、数据版本管理:Delta Lake 通过 Snapshot 等来管理、审计数据及元数据的版本,并进而支持 time-travel 的方式查询历史版本数据或回溯到历史版本;
3、开源文件格式:Delta Lake 通过 parquet 格式来存储数据,以此来实现高性能的压缩等特性;
4、批流一体:Delta Lake 支持数据的批量和流式读写;
5、元数据演化:Delta Lake 允许用户合并 schema 或重写 schema,以适应不同时期数据结构的变更;
6、丰富的DML:Delta Lake 支持 Upsert,Delete 及 Merge 来适应不同场景下用户的使用需求,比如 CDC 场景;
Apache Iceberg
1、格式演变:支持添加,删除,更新或重命名,并且没有副作用
2、隐藏分区:可以防止导致错误提示或非常慢查询的用户错误
3、分区布局演变:可以随着数据量或查询模式的变化而更新表的布局
4、快照控制:可实现使用完全相同的表快照的可重复查询,或者使用户轻松检查更改
5、版本回滚:使用户可以通过将表重置为良好状态来快速纠正问题
6、快速扫描数据:无需使用分布式SQL引擎即可读取表或查找文件
7、数据修剪优化 :使用表元数据使用分区和列级统计信息修剪数据文件
8、支持事务 :序列化隔离,表更改是原子性的,读取操作永远不会看到部分更改或未提交的更改
9、高并发:高并发写入使用乐观并发,即使写入冲突,也会重试以确保兼容更新成功
Apache Hudi
1、使用快速、可插入的索引进行更新、删除
2、增量查询,记录级别更改流
3、事务、回滚、并发控制
4、自动调整文件大小、数据集群、压缩、清理
5、用于可扩展存储访问的内置元数据跟踪
6、式摄取、内置 CDC 源和工具
7、支持 Spark、Presto、Trino、Hive 等的 SQL 读/写
8、向后兼容的模式演变和实施
有了数据湖之后,ETL有了一定的变化:
- 离线TB级的作业数据有问题,要修复数据,只需要delete或者update一下就可以了
- 数据增加字段问题,数据可以躺在那,需要的时候自己给schema
- 流批一体的环境构建数仓,链路变的简化了,核心思想就是我们使用统一的Delta Lake来做数据的中转。
那么这时候有人会问:数据湖能否替代数仓呢?
数据湖和数仓的关系,其实是一种相互补充的关系,生产落地的场景数据湖会作为上游存在,然后接入数仓,这也就是常说的湖仓一体。
那么再聊一下,湖仓一体具体是什么呢?
湖仓一体是一种新的数据管理模式,将数据仓库和数据湖的价值进行叠加,让湖中的数据可以流到数据仓库中;而数据仓库中的数据也可以保存于数据湖中,供数据挖掘时可以使用。通过将数据仓库和数据湖两者之间的差异进行融合,并将数据仓库构建在数据湖上,从而有效简化了企业数据的基础架构,提升数据存储弹性和质量的同时还能降低成本,减小数据冗余。
二、面试总结
看过前言之后,下面的问题应该很好回答啦
- 你觉得数据仓库有哪些优点和缺点
- 数据湖是什么
- 聊聊数据湖和数仓之间的区别
- 你接触过的数据湖产品有哪些,分别有什么特性
- 湖仓一体了解过吗