这是我参与「第四届青训营 」笔记创作活动的第9天。
发展历史
- 数据湖三阶段
- Hadoop的HDFS:没有记录文件的schema (包括列名、列类型,难以得知数据集包含了那些文件,是通过什么样的分区组织的,如果多个程序都在修改这个数据集(修改数据、修改表结构),其他程序难以配合做修改。
- Hive:引入Metastore 优化HDFS管理机制,但还需要ACID以及schema机制。
- 湖仓一体:结合数据湖和数据仓库的优势,将数据仓库中对于数据的严格管理直接实现到了低成本的分布式存储之上。
- 数据仓库:将数据从数据源提取和转换加载到目的地,存储计算不分离,严格控制写入数据的schema。保证ACID。成本高。
核心技术
- 数据湖中的ACID
- 如何确保原子性? (从用户可见性入手! )
- 用户只会读取以版本号数字命名的json文件 ,每次都读取到最大的版本号作为数据集的现状
- 新的写入写完parquet后开始写json文件 ,使用hash值对json文件命名,如a2fs4hfg8eejson
- 直到ison文件内容写入完毕 ,利用hdfs的renamelfAbsent能力将a2fs4hfg8e.json替换为00006.json,
- commit完成,新的读取将会以000006.json作为最新版本
- Update写入流程:
- 从最新的版本中,获取需要update的分区
- 乐观锁先把该写入的文件全落盘,然后进入写json阶段
- 发现版本号没变,直接写新的版本。版本号增加了,看看新增的这些版本有没有更新分区:没有则直接写新的版本。有则两者都更新了同一分区,需要重新update。
- 如何确保原子性? (从用户可见性入手! )
- Schema变更:ID将data和metadata的列名一一对应
- 唯一确定的ID,新增列赋予新ID,删列ID不复用。
- 写入数据时, ID也写入数据文件
- 读取数据时,用ID做映射,如果
- Data中没有 metadata中有:ADD
- Data中有,metadata中没有: DROP
- Data和metadata中都有同一ID,但是name不同: RENAME
- 如果都有同一列名,而ID不同:说明删列后又加了回来。
数据湖框架
Iceberg
- Apache Iceberg是一种新的表格格式,用于存储和分析大型的、移动缓慢的表格数据。它的工作方式类似于SQL表,它旨在改进内置在Hive、Presto 和Spark中的标准表布局。
Hudi(Hadoop Updates and Incrementals)
- Apache Hudi是一个Data Lakes的轻量级开源方案,能够基于HDFS之上管理大型分析数据集,可对数据进行CRUD,主要目的是高效减少数据延迟,可以作为lib与Spark、Flink进行集成。
Delta Lake
- Delta Lake 是一个构建湖仓架构的存储层框架,为 Apache Spark 和大数据 workloads 提供事务能力,通过写和快照隔离之间的乐观并发控制(optimistic concurrency control),在写入数据期间提供一致性的读取,从而为构建在 HDFS 和云存储上的数据湖(data lakes)带来可靠性。
选型标准
- 项目功能
- 如果强需求Upserts,Hudi更适合
- 如果希望可扩展性强那,Iceberg更适合
- 如果希望用上Z-Order等优化,Databricks 的企业版Delta更适合
- 数据湖取代Hive,成为HDFS上的表格式标准是必然的,在选择之前问自己四个问题:
- 需要的feature在哪个数据湖上是最稳定的
- 哪个数据湖能够用最简单的接入方式( SQL )用上最完善的功能
- 哪一个数据湖有计算引擎和社区的支持
- 哪一个数据湖的版本管理做的最好