数据湖的产出原因是数据处理架构的升级,最初版本的lambda架构,在Processor上是两套结构(stream processor和batch processor),数据服务层自然也就分为两套(实时对应speed serving,离线对应batch serving),如下图
在引入kappa架构之后,processor只剩下stream processor,数据服务层却难有一个框架来进行统一,如下图
kappa架构下对数据服务层的要求如下:
从功能特点上来分析,数据湖非常像性能非常好的关系型数据库(支持upsert、delete,有table schema,支持事务acid)
Apache Hudi(发音为“hoodie”)在hadoop兼容存储上提供流操作api,比如:
在本节中,我们将讨论关键概念和术语,这些概念和术语对于理解和有效使用这些api非常重要。
其核心是,Hudi维护了在不同时刻在表上执行的所有操作的时间轴,这有助于提供表的瞬时视图,同时还有效地支持按到达顺序检索数据。一个hudi instant(瞬态)由以下组件组成
Hudi保证在时间轴上执行的动作是原子的&时间轴基于瞬态时间一致。
关键的instant action包括:
任何给定的瞬态都可能处于下列状态之一
上面的例子显示了在10点到10点20之间发生在Hudi表上的upserts事件,大约每5分钟发生一次,commit元数据和其他后台清理/压缩一起留在了Hudi时间轴上。要特别注意的一点是:提交时间对应数据的到达时间(10:20AM),而实际数据组织是根据事件时间。这是两个不同的概念。
当出现延迟到达的数据时(预计9点到达的数据在1小时后10点20分到达),我们可以看到upsert将新数据生成到更老的时间桶/文件夹中。在时间轴的帮助下,尝试获取10:00小时以来成功提交的所有新数据的增量查询能够非常有效地只使用更改的文件,而不必扫描所有的时间桶> 07:00。
Hudi organizes a table into a directory structure under a basepath on DFS. Table is broken up into partitions, which are folders containing data files for that partition, very similar to Hive tables. Each partition is uniquely identified by its partitionpath, which is relative to the basepath.
Within each partition, files are organized into file groups, uniquely identified by a file id. Each file group contains several file slices, where each slice contains a base file (.parquet) produced at a certain commit/compaction instant time, along with set of log files (.log.*) that contain inserts/updates to the base file since the base file was produced. Hudi adopts a MVCC design, where compaction action merges logs and base files to produce new file slices and cleaning action gets rid of unused/older file slices to reclaim space on DFS.
Hudi将表组织成DFS上的一个基础路径下的目录结构。表被分成几个分区,这些分区是包含该分区的数据文件的文件夹,非常类似于Hive表。每个分区都由它的partitionpath唯一标识,它是相对于basepath的。
在每个分区中,文件被组织成由文件id唯一标识的文件组。每个文件组包含几个文件片,其中每个片包含一个在特定提交/压缩瞬间产生的基本文件(.parquet),以及一组日志文件(.log.*),这些日志文件包含自生成基本文件以来对基本文件的插入/更新。Hudi采用MVCC设计,其中压缩操作合并日志和基本文件以生成新的文件片,而清理操作删除未使用的/旧的文件片以回收DFS上的空间。