这是我参与「第四届青训营 」 笔记创作活动的第8天
-
发展阶段:
- hadoop:HDFS适用目录来区分不同的数据集
- hive:对数据湖中的数据集进行定义
- 湖仓一体:结合数据湖和数据仓库的优势,将对于数据的严格管理实现到了分布式存储之上
-
数据仓库:数据仓库将数据从数据源提取和转换,加载到目的地;数据仓库存储+计算不分离;数据仓库严格控制写入数据的schema
-
关键特征:
- Transcation(事务) ACID;Schema管理;存储计算分离;支持多种计算引擎和文件格式
Delta Lake
来源:databricks
工作重点:流批一体;Z-order优化
使用场景:Z-order等优化
Hudi
来源:滴滴,希望能够数据写入更低延迟
工作重点:高效的Upserts
- timeline Service:记录的信息类似于metadata
- Upsert :每一条样本都有一个主键pk,当upsert一条数据时,如果现有的数据中有就upate,无insert
- Incremental:某个时间点后新增的数据
- copy on Write:更新一个分区的时候,把原来的数据全部读出来做加工再写回去
- merge on Write:对原始数据的更新值以pk为merge更新
使用场景:强需求Upserts
Iceberg
来源:Netflix,希望能够摆脱Hive架构带来的问题
Well-designed Metadata Layer:
- files定义表结构
- lists存储一个snapshot中所有mainfest的信息
- manifests存储data files的信息,data diles就是具体的数据文件
使用场景:可扩展性强
核心技术
文件机构
写入数据湖的时候,按照每条数据的date进行分区,额外使用metadata文件记录表信息
Time travel:
-
每次写入的时候等生成一个元数据文件,记录变更;
- json文件以递增的版本号命名,记录本次新增/删除的文件
- 每产生N个json做一次聚合,记录完整的分区文件信息
- 用ckp记录聚合的版本号
-
分区数据在update时,不要删除旧数据,保证新旧共存;
-
元数据中存储具体的文件路径,而不仅仅是分区文件夹。
事务完整性
原子性:
每次都读区最大的版本号作为数据集的现状。新的写入使用hash值对json命名;知道json文件写入完成会rename,完成commit。下次读取以它为最新版本;
事务隔离:
从最新的版本中获取需要的update分区,先把该写入的文件全部罗盘,然后进入写json阶段。
版本进化:
id将data和metadata的列名做一一对应
总结
- 数据湖的相关概念比较新,一开始是HDFS,裸pd,txt日志等等。现在数据湖的概念约等于那三个产品
- 可以根据使用需求选择不同产品