一、概述
Hudi是数据湖的文件组织层,对Parquet格式文件进行管理提供数据湖能力,支持多种计算引擎,提供IUD接口,在 HDFS的数据集上提供了插入更新和增量拉取的流原语。
1、基础架构
2、基本特性
1、ACID事务能力,支持实时入湖和批量入湖。
2、多种视图能力(读优化视图/增量视图/实时视图),支持快速数据分析。
3、MVCC设计,支持数据版本回溯。
4、自动管理文件大小和布局,以优化查询性能准实时摄取,为查询提供最新数据。
5、支持并发读写,基于snapshot的隔离机制实现写入时可读取。
6、支持原地转表,将存量的历史表转换为Hudi数据集。
二、基本概念
1、TimeLine
Hudi数据湖可以维护很多张表,与Hive类似,数据存储在HDFS不同的目录结构中。Hudi维护了表在不同时刻执行的所有操作的Timeline,这有助于提供表的瞬时视图。
Timeline 是 HUDI 用来管理提交(commit)的抽象,每个 commit 都绑定一个固定时间戳,分散到时间线上。在Timeline上,每个commit被抽象为一个 HoodieInstant(Hoodie瞬时时刻),一个 instant 记录了一次提交(commit)的行为、时间戳、和状态,也就是说每个HoodieInstant 包含Action、Time、State三个部分
2、文件分布
Hudi将表组织成HDFS上某个指定目录(basepath)下的目录结构,表被分成多个分区,分区是以目录的形式存在,每个目录下面会存在属于该分区的多个文件,类似Hive表,每个Hudi表分区通过一个分区路径(partitionpath)来唯一标识。
3、支持表类型
(1)Merge On Read
读时合并表也简称mor表,使用列格式parquet和行格式Avro两种方式混合存储数 据。其中parquet格式文件用于存储基础数据,Avro格式文件(也可叫做log文 件)用于存储增量数据。
–优点 由于写入数据先写delta log,且delta log较小,所以写入成本较低
–缺点 需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为 需要将delta log 和 老数据文件合并。
(2)Copy On Write
写时复制表也简称cow表,使用parquet文件存储数据,内部的更新操作需要通过 重写原始parquet文件完成。
–优点 读取时,只读取对应分区的一个数据文件即可,较为高效
–缺点 数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据 文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后
4、读支持
Snapshot View
实时视图:该视图提供当前hudi表最新的快照数据,即一旦有最新的数据写入 hudi表,通过该视图就可以查出刚写入的新数据。 cow表和mor均支持这种视图能力。
Incremental View
增量视图:该视图提供增量查询的能力,可以查询指定COMMIT之后的增量数 据,可用于快速拉取增量数据。 cow表支持该种视图能力, mor表也可以支持该视图,但是一旦mor表完成 compact操作其增量视图能力消失。
Read Optimized View
读优化视图:该视图只会提供最新版本的parquet文件中存储的数据。 该视图在cow表和mor表上表现不同: 对于cow表,该视图能力和实时视图能力是一样的(cow表只用parquet文件存数 据)。 对于mor表,仅访问基本文件,提供给定文件片自上次执行compact操作以来的数 据, 可简单理解为该视图只会提供mor表parquet文件存储的数据,log文件里面 的数据将被忽略。 该视图数据并不一定是最新的,但是mor表一旦完成compact 操作,增量log数据被合入到了base数据里面,这个时候该视图和实时视图能力一 样。