湖仓一体-hudi

一、湖仓一体项目特点
1、使用hudi搭建

        主要有:1)沿用传统数仓中的分层思想;2)不需要做复杂的拉链表;3)不需要做全量增量表,延迟低,近似为实时的离线数仓;4)hudi自动解决小文件问题;5)所有层的数据均可在hive中通过hive的同步表进行查询(底层只有一份数据)。

2、使用hiveCatalog持久化元数据

        hiveCataglog作为表元数据持久化的介质,来管理元数据,不需要重复使用DDL创建表,只需要关心业务逻辑的SQL,简化了开发的流程。

        在Flink中创建表,表的元数据可以保存到hive的元数据中,在hive中可以看到flink的表,但是不能对flink的表进行查询。需要在启动flink sql client时显示指定配置文件。

3、使用flink sql进行开发
4、引入hive的系统函数作为flink内置函数
二、hudi基本概念
1、时间轴

        hudi的核心是维护表上在不同的即时时间执行的所有操作的时间轴,这有助于提供表的即时视图,同时还有效地支持暗道达顺序检索数据,一个instant由三个部分组成:

1)instant action:在表上执行的操作类型,commits一次表示将一批数据原子性地写入一个表;cleans清除表中不再需要的旧版本文件的后台活动;delta_commit增量提交指的是将一批数据原子性地写入一个MergeOnRead类型的表,其中部分或所有数据可以写入增量日志;compaction合并hudi内部差异数据结构的后台活动,例如将更新操作从基于行的log日志文件合并到列式存储的数据文件,内部视为特殊提交;rollback表示commit/delta_commit不成功时进行回滚,会删除在写入过程中产生的部分文件;savepoint将某些文件组标记为已保存,以便其不会被删除,在发生灾难需要恢复数据的情况下,它有助于将数据集还原到时间轴的某个点。

2)instant time:时间戳(20240423090000),按照动作开始时间的顺序单调增加;

3)staterequeed表示某个action已经调度,但尚未执行;inflight表示action当前正在执行;completed表示timeline上的action已经完成;

4)两个时间的概念,Arrival time为数据到达hudi的时间,commit time;Event time为record中记录的时间。

2、文件布局

        hudi将一个表映射为如下文件结构如下,元数据包括表版本管理(Timeline)、归档目录(存放过时的instant也就是版本),一个instant记录了一次提交(commit)的行为、时间戳和状态,hudi以时间轴的形式维护了在数据集上执行的所有操作的元数据;数据以分区方式存放数据,里面放着BaseFile和LogFile。

(1)hudI将数据表组织成分布式文件系统基本路径下的目录结构;

(2)表被划分为多个分区,这些分区是包含该分区的数据文件和文件夹;

(3)在每个分区中,文件被组织成文件组,由文件ID唯一标识;

(4)每个文件组包含几个文件片(FileSlice);

(5)每个文件片包含一个基本文件(在某个commit/compaction即时时间生成的文件,MOR可能没有)和多个日志文件(包含自生成基本文件以来对基本文件的插入/更新,COW没有);

(6)hudi采用了多版本并发控制(MVCC),compaction操作合并日志和基本文件以产生新的文件片,clean操作清楚不使用的旧的文件片以回收文件系统上的空间;

(7)hudi的base file在footer的neta去记录了record key组成的BloomFilter,用于在file base index的实现中实现高效率的key contains检测,只有不在BloomFilter的key才需要扫描整个文件消灭假阳。

(8)hudi的log(avro文件)是自己编码的,通过积攒数据buffer以logBlock为单位写出,每个logBlock包含magic number、size、content、footer等信息,用于数据读、校验和过滤。

3、索引

(1)hudi通过索引机制提供高效的upserts,具体是将给定的hoodie key(record key + partition path)与文件id(文件组)建立唯一映射,数据第一次写入文件后索引保持不变,所以一个fileGroup包含了一批record的所有版本记录,index用于区分消息是insert还是update。

(2)全局索引在全表的所有分区范围下强制要求键的唯一性,但是随着表增大,update/delete操作损失的性能越高,适用于小表。

(3)非全局索引,默认的索引实现,只能保证数据在分区的唯一性,依靠写入器为同一个记录的update/delete提供一致的分区路径,适用于大表。

(4)Hbase索引本质是一个全局索引,bloom和simple index都有全局选项。

hoodie.index.type=GLOBAL_BLOOM/GLOBAL_SIMPLE

3、表类型

(1)copy On Write

        在cow表中,只有数据文件/基本文件(parquet),没有增量日志文件(log),对每一个新批次写入都将创建相应数据文件的新版本(新的FileSlice),新版本文件包括旧版本文件的记录以及来自传入批次的记录(全量最新)。

        在写入期间进行合并,cow会产生一些写入延迟,但是其优势在于它的简单性,不需要其他表服务(如压缩),也相对容易调试。

(2)merge On Read

        mor表中,包含列存的基本文件(parquet)和行存的增量日志文件(基于行的avro格式,.log)。合并成本在读取端,因此在写入期间不会合并或创建较新的数据文件版本,标记/索引完成后,对于具有要更新记录的现有数据文件,hudi创建增量日志文件并适当命名他们,以便它们都属于一个文件组。用户可以选择内联或异步模式进行压缩,如将压缩的最大增量日志配置为4,意味着4次增量写入后将对数据文件进行压缩并创建更高版本的数据文件。

3、查询类型

(1)snapshot queries快照查询,可以查询指定commit/delta commit即时操作后表的最新快照,在mor表的情况下,通过即时合并最新文件片的基本文件和增量文件来提供近实时表。对于cow,可以替代现有的parquet表,同时提供upsert/delete和其他写入方面的功能,可以理解为查询最新版本的parquet数据文件。

(2)incremental queries增量查询,可以查询给定commit/delta commit即时操作以来新写入的数据,有效的提供变更流来启用增量数据管道。

(3)read optimized queries读优化查询,可以查询给定commit/compact即时操作的表的最新快照,仅将最新文件片的基本/列文件暴露给查询,并保证与非Hudi表相同的列查询性能。

4、数据写

(1)upsert:默认行为,数据先通过index打标(insert/update),有一些启发式算法决定消息的组织以优化文件的大小=>CDC写入;insert:跳过Index,写入效率更高=>Log Deduplication;bulk_insert:写排序,对大数据量的hudi表初始化友好,对文件大小的限制best effort(写Hfile)。

(2)upsert在cow模式下的写入流程:1)先对records按照record key去重;2)首先对这批数据创建索引(HoodieKey=>HoodieRecordLocation),通过索引区分哪些records是update,哪些是insert(key第一次写入);3)对于update消息,会直接找到对应key所在的最新FileSlice的base文件,并做merge后写新的base file(新的FileSlice);4)对于insert消息,会扫描当前partition的所有SmallFile(小于一定大小的base file),然后merge写新的FileSlice,如果没有SmallFile,直接写新的FileGroup+FileSlice。

(3)upsert在mor模式下的写入流程:1)先对records按照record key去重;2)首先对这批数据创建索引(HoodieKey=>HoodieRecordLocation),通过索引区分哪些records是update,哪些是insert(key第一次写入);3)对于insert消息,如果logFIle不可创建索引(默认),会尝试merge分区内最小的baseFile(不包含logFIle的FileSlice),生成新的FileSlice,如果没有baseFile就新写一个FileGroup+FileSlice+baseFile,如果logFile可创建索引,尝试append小的logFile,如果没有就新写一个FileGroup+FileSlice+baseFile;4)对于update消息,写对应的FileGroup+FileSlice,直接append最新的logFile(如果碰巧是当前最小的小文件,会merge base file,生成新的file Slice);5)logFile大小达到阈值会roll over一个新的。

5、compaction

(1)没有baseFile走cow insert流程,直接merge所有的logFile并写baseFile;

(2)由baseFile走cow upsert流程,先读logFile建index,再读baseFile,最后读logFile写新的baseFile;

(3)flink和spark streaming的writer都可以apply异步的compaction策略,按照间隔commits数或者时间来触发compaction任务,在独立的pipline中执行。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值