这是我参与「第四届青训营 」笔记创作活动的的第11天
01.发展历史
Hadoop->Hive->湖仓一体 数据湖+数据仓库
什么是数据湖?
- 数据相关概念比较新,一直处在演进当中
- 一开始是HDFS,裸pb、txt日志等等,叫数据湖(管不动了就叫数据沼泽)
- 后来出现了了Iceberg、Hudi、Delta Lake 了,数据湖概念就基本等于这些产品了
- 也更贴近于Lakehouse的概念
什么是数据仓库?
- 数据仓库将数据从数据源提取和转换,加载到目的地
- 数据仓库存储+计算不分离
- 动数据仓库严格控制写入数据的schema
湖仓一体(数据湖的现状)︰
- 结合了数据湖和数据仓库的优势
- 将数据仓库中对于数据的严格管理直接实现到了低成本的分布式存储之上 Key Features :
- Transaction ACID
- Schema管理
- 存储计算分离
- 支持多种计算引擎和文件格式
02.核心技术
Time travel
Transaction
原子性
事务隔离
Schema Evolution
03.各有所长
lceberg
lceberg是什么?
lceberg是一个Well-designed Metadata Layer
1.Metadata files定义了表结构,存储了snapshot信息,分区列信息等
2.Manifest lists存储了一个snapshot 中所有manifest的信息
3.Manifests存储了一些data files的信息
4.Data files就是具体的数据文件
lceberg工作重点
a.用户体验
1.Schema evolution
2. Partition evolution
3. Hidden partition4.Time Travel5. Version Rollback\
b.性能
1.快速file plan
2.更多的filter方式
c.可靠性
- ACID Transaction
- 完全开源,由Apache孵化开发
Data files Filter
一些有助于filter 的数据被层层记录,比如:\
- Manifest file记录了每个data file的分区范围\
- Manifest list记录了每个manifest file的分区范围分区可以被快速定位!可以做manifest list级别裁剪。\
- Manifest file记录了每个data file每一列的最大值,最小值可以通过其他的列(Userld)做data file 级别裁剪
lceberg的分区方式:
数据中包含timestamp 列,设置好partition transform方式 设置为date时,iceberg帮你转化为date分区 设置为hour时,iceberg帮你转化为hour分区 lceberg记录了这层转化关系,并且按你的需要进行partition evolution
Hudi
--Hadoop Upsert Delete and Incremental
Hudi工作重点:
- Timeline service: Hudi 管理transaction的方式
- Hudi Table Type: Copy on Write / Merge on Read
- 高效的Upserts: update or insert 4.索引表:快速定位一条数据的位置
- Streaming Ingestion Service6.完全开源,由Apache孵化
Timeline Serivce & Upsert & Incremental
- Timeline Service:记录的信息类似于metadata
- Upsert:每一条样本都有一个主键PK,当Upsert一条数据时,如果现有的数据中有这个PK,则update 这条数据。否则直接insert 这条数据
- Incremental:某个时间点后新增的数据
Copy on Write
Merge On Read
Delta Lake
Delta Lake工作重点
1.ACID Transaction
2. Schema校验(不是evolution)
3.流批一体
4. Time Travel
5. Upsert/Delete
6. Z-Order优化
7.只开源了一部分,由Databricks自己主导开发,Z-order 等优化的实现未开源
流批一体
04.总结场景
技术选型
短期来看:每个项目都有一些属于自己的功能:
- 如果强需求Upserts,也许Hudi是最好的选择
- 如果希望可扩展性强,那么设计优良的lceberg是最好的选择
- 如果希望用上Z-Order等优化,那么掏钱买Databricks的企业版 Delta是不二之选
长期来看:数据湖取代 Hive,成为HDFS上的表格式标准是必然的,在选择之前问自己四个问题:
1.我需要的feature在哪个数据湖上是最稳定的
2.哪一个数据湖能够用最简单的接入方式(SQL)用上最完善的功能
3.哪一个数据湖有计算引擎侧的支持和社区的支持
4.哪一个数据湖的版本管理做的最好,最鲁棒
字节跳动数据湖场景举例
批流一体:近实时的数据写入与数据就绪(Readiness)
1.例子:消息队列直接入湖、流式 Upsert
2. 应用:能同时训最新(流式)和历史(批式)
更强的算力:要求更快的读数据
- 例子:分布式任务扫描、向量化读与读时合并、统一内存格式(Apache Arrow)
2.应用:数据读取不应成为训练瓶颈