数据湖三剑客 | 「掘金日新计划 · 10 月更文挑战」

104 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

1659880700329.png

结合数据湖和数据仓的优势

  • ACID(数仓)
  • schema 管理(数仓)
  • 存算分离(数据湖)
  • 多引擎和文件格式支持

2.核心技术

文件结构:

1.按照date分区 2.额外使用metadata文件记录表信息

更改和更新

Time travel:同时读取多个版本的数据

  • 每次写入新生成一个json元数据文件,以递增版本号命名,记录变更(分区数据在更新时,不删除旧数据,新旧共存;元数据存具体的文件路径);
  • 每N个json做一次聚合并记录分区信息
  • 用checkpoint记录上次做聚合的版本号
  • 可以定期删一些过久数据!

Transaction:事务,ACID

  1. 原子性:写入要么可见要么不可见,先写入 parquet 文件,以 Hash.parquet 文件存储,写完后写 Hash.json,写完后尝试重命名为版本号.json,如果失败就无法 commit,新写入在没有 commit 前用户无法读取(用户只读当前 最大版本号.json)
  2. 一致性:计算引擎保证,输入是什么,落盘的就是什么
  3. 事务隔离:Update 时采用乐观锁,先全写文件,进入写 json,看版本号有无变化,若变化,查看新增版本是否更新我要更新的分区,没有则写新版本,有则重新 update。
  4. 持久性:存储引擎保证,服务器重启结果不变

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工作重点

image.png

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)

  1. Timeliness service
  2. Hudi Table Type: Copy on Write/merge on Read
  3. 高效的Upserts
  4. 索引表-快速定位
  5. Streaming Ingestion Service
  6. 完全开源 Apache孵化

image.png

  • Timeline Serivce:记录的信息类似于metadata,是Hudi管理transaction的方式
  • Upsert:每一条样本都有一个主键PK,当Upsert-条数据时,如果现有的数据中有这个PK,则update这条数据。否则直接insert这条数据
  • Incremental:某个时间点后新增的数据

Delta Lake

  1. ACID Transaction
  2. Scheme校验
  3. 流批一体
  4. Time Travel
  5. Upsert/Delete
  6. Z-Order优化
  7. 部分开源