持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天
1.发展历史
数据湖三阶段:Hadoop、Hive、湖仓一体
Hadoop
成本低、规模大、难管理
数据湖最初的概念——HDFS-分布式存储系统(不在本地、远程、无限大、可共享)
HDFS通过将文件分块来存储大文件,HDFS的组件有NameNode和 DataNode,分别负责提供元数据和数据服务。在读/写数据时,HDFS客户端需要先从 NameNode 上获取数据读取/写入的 DataNode地址,然后和DataNode交互来完成数据读/写。
优点:
- 可以实现分布式存储——便于共享,数据访问方便灵活
- 不同目录区分数据集
缺点:数据沼泽
- 没有记录文件的schema,无法知道HDFS里数据schema是什么样的,需要使用schema on query的方式
- 不能做到多个人同时去修改HDFS里的数据
Hive
引入了Hive Metastore——对数据湖中的数据进行集中定义
- 数据湖中存了那些数据集
- 存在什么目录
- 数据集的schema是什么样子
- 数据集有哪些分区,每个分区目录是什么
缺点:
- 建好表以后,不能对schema进行变更,比如删掉一列这种操作
- 不能多人同时修改、读写
湖仓一体
数据仓库:
- 将数据从数据源提取和转换,加载到目的地
- 存算不分离
- 严格管控 schema
结合数据湖和数据仓的优势
- ACID(数仓)
- schema 管理(数仓)
- 存算分离(数据湖)
- 多引擎和文件格式支持
2.核心技术
文件结构:
1.按照date分区 2.额外使用metadata文件记录表信息
更改和更新
Time travel:同时读取多个版本的数据
- 每次写入新生成一个json元数据文件,以递增版本号命名,记录变更(分区数据在更新时,不删除旧数据,新旧共存;元数据存具体的文件路径);
- 每N个json做一次聚合并记录分区信息
- 用checkpoint记录上次做聚合的版本号
- 可以定期删一些过久数据!
Transaction:事务,ACID
- 原子性:写入要么可见要么不可见,先写入 parquet 文件,以 Hash.parquet 文件存储,写完后写 Hash.json,写完后尝试重命名为版本号.json,如果失败就无法 commit,新写入在没有 commit 前用户无法读取(用户只读当前 最大版本号.json)
- 一致性:计算引擎保证,输入是什么,落盘的就是什么
- 事务隔离:Update 时采用乐观锁,先全写文件,进入写 json,看版本号有无变化,若变化,查看新增版本是否更新我要更新的分区,没有则写新版本,有则重新 update。
- 持久性:存储引擎保证,服务器重启结果不变
Schema Evolution
1.用户不直接读 parquet 文件,通过数据湖接口读取分区 parquet,数据湖读取时在 schema 上处理
2.ID 将 data 和 metadata 的列名一一对应,删除 ID 不会复用(唯一性)写入数据时,ID 写入数据文件,读取时:
- Data 没有 metadata 有:ADD
- Data 有 metadata 无:DROP(读取时不读)
- Data 有 metadata 有但名字不同:RENAME
- 新增列赋予新ID,删除过的ID不再用
- 将ID写入数据,用于判断数据版本
- Data 是 parquet数据文件 —— 先写入
- Metadata 是 Json 元数据文件 —— 后写入
3.三大数据湖的特点
Iceberg工作重点
metadata layer分为三层
用户体验
- Schema evolution
- Partion evolution
- Hidden partition(数据中包含timestamp 更好的分区 partition transform方式,可以转化分区)
- Time Travel
- Version Rollback
性能
- 快速file plan
- 更多的filter方式:有助于filter的数据被层层记录
可靠性
- ACID Transaction
完全开源,由Apache孵化开发
Hudi (Hadoop Upsert Delete and Incremental)
- Timeliness service
- Hudi Table Type: Copy on Write/merge on Read
- 高效的Upserts
- 索引表-快速定位
- Streaming Ingestion Service
- 完全开源 Apache孵化
- Timeline Serivce:记录的信息类似于metadata,是Hudi管理transaction的方式
- Upsert:每一条样本都有一个主键PK,当Upsert-条数据时,如果现有的数据中有这个PK,则update这条数据。否则直接insert这条数据
- Incremental:某个时间点后新增的数据
Delta Lake
- ACID Transaction
- Scheme校验
- 流批一体
- Time Travel
- Upsert/Delete
- Z-Order优化
- 部分开源