这是我参与【第四届青训营-大数据场】笔记创作活动的第11天
HDFS-分布式存储系统:
HDFS 通过将文件分块来存储大文件,HDFS 的组件有 NameNode 和 DataNode,分别负责提供元数 据和数据服务。在读/写数据时,HDFS 客户端需要先从 NameNode 上获取数据读取/写入的 DataNode 地址,然后和 DataNode 交互来完成数据读/写。
Parquet-高性能列式存储
过滤下推到存储侧,更好地压缩性能。
数据湖
数据湖最开始的概念--分布式存储HDFS使用目录来区分不同的数据集
/douyin -120220623
/20220624/toutiao
好处:
同一公司/组织可以使用共享存储数据访问方便,灵活性高
坏处:
1.没有记录文件的schema(包括列名、列类型),经常使用Schema on Query的方式 2.难以得知数据集包含了那些文件,是通过什么样的分区组织的 3.如果多个程序都在修改这个数据集(修改数据、修改表结构),其他程序难以配合做修改
容易陷入数据沼泽
数据湖的演进--Hive Metastore
对数据湖中的数据集进行集中“定义” -数据湖中存在了哪些数据集
- 它们都存储在什么目录 -数据集的schema是什么样子的
- 数据集有哪些分区,每个分区的目录是什么
- 如果这张hive表是静态的,没有新增写入,则所有读取方都能很便捷的使用问题来了:
- 假设Reader A和B都正在读取分区/20220623下的文件
- 此时Writer B开始重写/20220623分区,一些文件被删了,一些文件增加了,一些文件还在修改中 Reader A和B读到的文件可能是不同的! - 我们需要 Transaction ACID!问题又来了:
- 分区/20220623下存储了schema为date|userId|phoneNumber 的数据需要注意:Hive allows us to add column after last column only
- 根据合规,我需要删掉phoneNumber,但是在Hive表上做不到。只好重写一张表(耗费资源) - 我们需要支持更多样的schema 变更! And more !
数据湖中的 ACID:
- Atomicity: 原子性- 本次写入要么对用户可见,要么不可见(需要设计)
- Consistency: 一致性-输入是什么,落盘的就是什么(由计算引擎保证)
- Isolation: 事务隔离-正确解决读写冲突和写写冲突(需要设计)
- Durability: 持久性-落完数据后,即便服务器重启结果不变(由存储引擎保证)