数据湖是目前比较热的一个概念,许多企业都在构建或者计划构建自己的数据湖。
数据湖是一个集中式存储库,允许您以任意规模存储所有结构化和非结构化数据。您可以按原样存储数据(无需先对数据进行结构化处理),并运行不同类型的分析 – 从控制面板和可视化到大数据处理、实时分析和机器学习,以指导做出更好的决策。
引用一下AWS数据仓库和数据湖官方对比。
总结: 数据湖对数据包融性更强,数据处理方式更多样化。 反之, 数据湖的数据更乱
Hudi是Uber公司开源的数据湖架构,它是围绕数据库内核构建的流式数据湖,一种新的技术架构。
根据流式的需求,他设计文件存储和管理 实现 “COW vs MOR” 两种数据模型
为了适应这种hudi的数据模型并融入现在的大数环境,他给所有组件写了huid 插件。
Hudi作为一个数据湖方案,他自己本身不产生任何业务数据, 也不用单独布署。完全依附于其它大数据组件
支持 spark、flink、map-reduce 等计算引擎继续对 hudi 的数据进行再次加工处理
Hudi表的数据文件,可以使用操作系统的文件系统存储,也可以使用HDFS这种分布式的文件系统存储。为了后续分析性能和数据的可靠性,一般使用HDFS进行存储。以HDFS存储来看,一个Hudi表的存储文件分为两类。
Hudi把随着时间流逝,对表的一系列CRUD操作叫做Timeline,Timeline中某一次的操作,叫做Instant。
hoodie文件夹中存放对应操作的状态记录
Timeline来解决因为延迟造成的数据时序问题
Hudi真实的数据文件包含一个metadata元数据文件(记录分区)和数据文件parquet列式存储。
为了实现数据的CRUD,需要能够唯一标识一条记录,Hudi将把数据集中的唯一字段(record key ) + 数据所在分区 (partitionPath) 联合起来当做数据的唯一键。
Hudi维护着一个索引,以支持在记录key存在情况下,将新记录的key快速映射到对应的fileId。
Hudi提供两类型表:写时复制(Copy on Write,COW)表和读时合并(Merge On Read,MOR)表。
简称COW,顾名思义,它是在数据写入的时候,复制一份原来的拷贝,在其基础上添加新数据。正在读数据的请求,读取的是最近的完整副本,这类似Mysql 的MVCC的思想。
COW表主要使用列式文件格式(Parquet)存储数据,在写入数据过程中,执行同步合并,更新数据版本并重写数据文件,类似RDBMS中的B-Tree更新。
简称MOR,新插入的数据存储在delta log 中,定期再将delta log合并进行parquet数据文件。
读取数据时,会将delta log跟老的数据文件做merge,得到完整的数据返回。下图演示了MOR的两种数据读写方式。
MOR表是COW表的升级版,它使用列式(parquet)与行式(avro)文件混合的方式存储数据。在更新记录时,类似NoSQL中的LSM-Tree更新。
在 READ OPTIMIZED 模式下,只会读最近的经过 compaction 的 commit。
Hudi支持三种不同的查询表的方式:
动态合并最新的基本文件(parquet)和增量文件(Avro)来提供近实时数据集
仅查询新写入数据集的文件,需要指定一个Commit/Compaction的即时时间(位于Timeline上的某个instant)作为条件,来查询此条件之后的新数据
直接查询基本文件(数据集的最新快照),其实就是列式文件(Parquet)。
《数据湖技术架构演进》
《数据湖系列文章》
《Hudi官方文档》