数据湖Hudi-2-Hudi基本概念
核心概念
1.基本概念
1.时间轴(TimeLine)
Hudi的核心是维护表 在不同的即时时间(instants) 执行的所有操作的 时间轴(timeline),这样做:1.可以提供表的即时视图;2.有效支持按到达顺序检索数据。
instant由一下三部分组成:
- 1.Instant action
- 2.Instant time
- 3.State
-
- 两个时间概念
hudi中两个重要的时间概念:
- Arrival time:数据到达Hudi时间,commit time。
- Event time:record中记录的时间。
- 对于迟到数据,通过时间维度方面的处理,迟到数据也会对应落地到对应的正确分区,不会落地到错误的分区。
- 两个时间概念
2.文件布局(File Layout)
1.文件结构
Hudi存储分为一下两部分:
- 元数据
- 数据
2.文件管理
-
1.Hudi将数据表组织成分布式文件系统基本路径(basepath)下的目录结构。
-
2.表被划分为多个分区,这些分区是包含该分区的数据文件的文件夹,非常类似于Hive表。
-
3.在每个分区中,文件被组织成文件组,由文件ID唯一标识。
-
4.每个文件组包含几个文件片(FileSlice)
-
5.每个文件片包含:
-
6.Hudi采用多版本并发控制(Multiversion Concurrency Control,MVCC)
- compaction操作:合并日志和基本文件以产生新的文件片
- clean操作:清除不使用的/旧的文件片以回收文件系统上的空间。
-
7.Hudi中应用的布隆过滤器
-
8.Hudi中的Log文件组成
3.索引(Index)
1.索引的原理:
Hudi通过索引机制提供高效的upserts,具体是将给定的hoodie key(record key+partition path)与文件id(文件组)建立唯一映射。这种映射关系,**数据第一次写入文件后保持不变**,所以,一个FileGroup包含了一批record的所有版本记录。Index用于区分消息是INSERT还是UPDATE。
![有索引的优势,减少文件的扫描](https://img-blog.csdnimg.cn/f52591d8a0a443428fbb05746a526bcf.png)
2.索引的优势:
Hudi为了消除不必要的读写,引入了索引的实现。在有了索引(Index)之后,更新的数据可以快速被定位到对应的File Group。上图为例,白色是基本文件,黄色是更新数据,有了索引机制后,可以做到:避免读取不需要的文件、避免更新不必要的文件、无需将更新数据和历史数据做分布式关联,只需要在File Group内做合并。
3.索引的类型:
4.全局索引和非全局索引(除了Hbase的索引是全局索引,其他索引类型默认使用非全局索引)
- 非全局索引适用于大表
- 全局索引适用于小表
5.索引的选择策略
- 1.对事实表的延迟更新:选择布隆过滤器
最新的数据在最近更新 - 2.对事件表的去重
- 3.对维度表的随机更删
针对分区路径发生变化的情况,需要设置参数,来解决这样问题。
4.表类型(Table Types)
1.COW(Copy On Write)
- 在COW表中,只有数据文件/基本文件(.parquet),没有增量日志文件(.log.*)。
- 对每一个新批次写入都将创建相应数据文件的新版本(新的FileSlice),新版本文件包括旧版本文件的记录以及来自传入批次的记录(全量最新)。
COW由于在写入期间进行合并,则会产生一些写入延迟。但是COW的优势在于他的简单性,不需要其他表服务(不需要压缩 compaction),相对容易调试。
2.MOR(Merge On Read)
- MOR表中,包含列存的基本文件(.parquet)和行存的增量日志文件(基于行的avro格式,.log.*)。
3.COW与MOR对比
COW比较适合于批处理,因为中间有写放大的情况。批处理更加适合于此场景。
MOR 相对比较适合于流式处理,追加数据的情况写入。加少了写放大,更新成本较低。也可以适用于批处理。
5.查询类型(Query Types)
1.快照查询(Snapshot Queries)
2.增量查询(Incremental Queries)
- 不是查询全量数据,是指定某次commit或者delta commit的数据的增量的查询。只能查询当本次增量的变化的数据。
3.读优化查询(Read Optimized Queries)
- 对于MOR类型表来说,不是查询了最终的全量数据,因为是在compact状态提交的数据,compact状态之后,MOR类型的表格有可能会产生多次增量提交,生成多个.log文件。这其中的.log文件就不能被查询到。