这是我参与「第四届青训营 」笔记创作活动的第16天
本次笔记重点内容
- 发展历史——数据湖三阶段
- 核心技术
- 不同的湖仓一体各有所长
- 应用
发展历史
- 数据湖最开始的概念——Hadoop,HDFS
同一公司/组织可以使用共享存储,数据访问方便,灵活性高。但是需要有一定知识的人才能使用;难以得知数据集包含了哪些文件、如何组织;多个程序都在修改这个数据集,其他程序又难以配合进行修改。
- 数据湖的演进——Hive
对数据湖中的数据集进行集中“定义”。但Hive表是静态表,读和写不同步,不同人读到的文件可能不同。
- 湖仓一体阶段
什么是数据仓库?就是将数据从数据源提取和转换加载到目的地的仓库,存储计算不分离。数据湖存储成本低,数据仓库对于数据是严格管理的,两者结合。
业界三大数据湖
核心技术
Time travel
每次写入都生成一个新的元数据文件,记录变更;分区数据在更新时,不要删除旧数据,保证新旧共存;元数据中存储具体文件路径,不仅仅是分区文件夹。
Transaction——事务
ACID
数据库在写入或更新资料的过程中,为保证事务是准确可靠的所必备的四个特性:
| ACID特性 | 说明 |
|---|---|
| 原子性(Atomicity) | 要么A-10,要么B+10,要么都不变——本次写入要么对用户可见,要么不可见 |
| 一致性(Consistency) | A减多少B就要加多少——输入是什么,落盘就是什么 |
| 隔离性(Isolation) | A和C同时给B转10,B最终结果应该是+20——正确解读读写冲突和写写冲突 |
| 持久性(Durability) | 一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作 |
Schema Evolution
用一个ID将data和metadata的列名做一一对应。每一列赋予唯一确定的ID,删的列的ID不复用;写入数据时,ID也写入数据文件;读取数据时,用ID做映射——Data中有/没有,metadata中没有/有,说明是Drop/Add,若都有或都没有但是Name不同,说明Rename。
不同湖仓一体
Iceberg——快速file plan/更多的filter方式
Metadata Layer
右边metadata file中多的s1对应多的manifest file,多的manifest file对应多的data files。manifest list记录了每一个manifest file分区范围;manifest file记录了每一个data files分区范围和data file每一列的最大值最小值。
Hidden Partition
数据中包含timestamp列,设置好partition transform方式,设置为date/hour时,iceberg就帮忙转化到那个分区并记录这层转化方便以后按需求进行革新。
Hudi——高效Upserts(update/insert)/Timeline service/索引表(快速定位一条数据)
Copy on Write
更新时要把所有数据读出来,加工后再全部写回去
Merge On Read
把需要update的行读出来就好
Delta Lake——ACID Transaction/Schema校验/流批一体/Time Travel
总结场景
- 短期看:强需求Upserts就选Hudi;希望可扩展性强就选Iceberg;希望用Z-Order(数据排布方式按Z字形走)优化就选企业版Delta
- 长期看:注意我需要的feature在哪个数据湖上最稳定,哪一个数据湖能用最简单的接入方式(SQL)用上最完善的功能,哪一个数据湖有计算引擎和社区的支持