Delta Lake、Hudi 与 Iceberg|青训营笔记

94 阅读2分钟

这是我参与【第四届青训营-大数据场】笔记创作活动的第11天

HDFS-分布式存储系统:

HDFS 通过将文件分块来存储大文件,HDFS 的组件有 NameNode 和 DataNode,分别负责提供元数 据和数据服务。在读/写数据时,HDFS 客户端需要先从 NameNode 上获取数据读取/写入的 DataNode 地址,然后和 DataNode 交互来完成数据读/写。

Parquet-高性能列式存储

过滤下推到存储侧,更好地压缩性能。

数据湖

数据湖最开始的概念--分布式存储HDFS使用目录来区分不同的数据集

/douyin -120220623

/20220624/toutiao

好处:

同一公司/组织可以使用共享存储数据访问方便,灵活性高

坏处:

1.没有记录文件的schema(包括列名、列类型),经常使用Schema on Query的方式 2.难以得知数据集包含了那些文件,是通过什么样的分区组织的 3.如果多个程序都在修改这个数据集(修改数据、修改表结构),其他程序难以配合做修改

容易陷入数据沼泽

1847ee332b91e16cb5bdee55fdf30c6.png

数据湖的演进--Hive Metastore

对数据湖中的数据集进行集中“定义” -数据湖中存在了哪些数据集

  • 它们都存储在什么目录 -数据集的schema是什么样子的
  • 数据集有哪些分区,每个分区的目录是什么
  • 如果这张hive表是静态的,没有新增写入,则所有读取方都能很便捷的使用问题来了:
  1. 假设Reader A和B都正在读取分区/20220623下的文件
  2. 此时Writer B开始重写/20220623分区,一些文件被删了,一些文件增加了,一些文件还在修改中 Reader A和B读到的文件可能是不同的! - 我们需要 Transaction ACID!问题又来了:
  3. 分区/20220623下存储了schema为date|userId|phoneNumber 的数据需要注意:Hive allows us to add column after last column only
  4. 根据合规,我需要删掉phoneNumber,但是在Hive表上做不到。只好重写一张表(耗费资源) - 我们需要支持更多样的schema 变更! And more !

3b86fc50db2727b77cf11fd9cd080a7.png 数据湖中的 ACID:

  1. Atomicity: 原子性- 本次写入要么对用户可见,要么不可见(需要设计)
  2. Consistency: 一致性-输入是什么,落盘的就是什么(由计算引擎保证)
  3. Isolation: 事务隔离-正确解决读写冲突和写写冲突(需要设计)
  4. Durability: 持久性-落完数据后,即便服务器重启结果不变(由存储引擎保证)