什么是 Hudi ?
Hudi 是一个用于处理大数据湖的开源框架。
大数据湖是指一个大规模的、中心化的数据存储库,其中包含各种类型的数据,如结构化数据、半结构化数据和非结构化数据,目的是为企业提供一个集中的数据存储库,从而更容易地进行数据分析和洞察。
Hudi支持数据操作模式:Insert
、Update
和 Delete
。这些操作是原子性的,因此在多个客户端并发访问时,数据的一致性得到了保证。另外,Hudi 支持基于时间戳的查询,使得可以轻松地查询某个时间点的数据快照。Hudi 还支持增量式处理,可以高效地处理大量的数据更新。
Hudi 是如何对数据进行管理的?
Hudi 通过管理数据的元数据,实现了对数据的管理。
具体来说,Hudi 将数据分为两个部分:数据本身和元数据。数据本身是指实际的数据,而元数据是指描述数据的数据,包括数据的结构、位置、格式、版本等信息。
Hudi 使用元数据来跟踪数据的变化,包括数据的插入、更新和删除等操作,并提供高效的查询功能,支持各种查询条件和时间点的查询。
在 Hudi 中,每个数据集都有一个元数据文件,用于描述数据集的结构、版本、位置等信息。每当数据集发生变化时,Hudi 会更新元数据文件,以便跟踪数据的变化。此外,Hudi还提供了一些工具,如命令行界面和 API,用于管理和查询数据集的元数据信息。
Hudi 还提供了两种不同的数据格式: Write-Optimized Format
和 Read-Optimized Format
。
Write-Optimized Format
针对写入操作进行了优化,可以高效地插入和更新数据,但查询性能较差。
Read-Optimized Format
则针对查询操作进行了优化,可以快速地读取数据,但写入性能较差。
Hudi 表结构
Hudi 是一种基于 Hadoop 的数据管理框架,可用于在分布式环境中管理大规模数据集。它提供了一种用于存储和处理数据的表结构,该结构被称为 Hudi 表。
Hudi 表由多个文件组成,这些文件位于 Hadoop 分布式文件系统(HDFS)或其他支持 Hadoop API 的文件系统中。Hudi 表的文件结构基于 Apache Parquet 格式,并且可以通过 Hudi 提供的 API 进行读写操作。
Hudi 的表结构在 HDFS 上的目录结构是比较复杂的,由以下几部分组成:
1. 表根目录(Table Root)
表根目录是Hudi表的顶级目录,它包含了表的元数据、数据文件以及其他Hudi特定的文件和目录。它的目录结构如下:
<Table Root>
├── .hoodie
│ ├── _SUCCESS
│ ├── .temp
│ ├── .tmp
│ ├── archive
│ ├── meta.properties
│ ├── metadata
│ ├── timeline.json
│ ├── version
│ ├── write.lock
│ └── ...
├── partition_1
│ ├── .hoodie_partition_metadata
│ ├── .hoodie_partition_metadata.json
│ ├── 2021/01/01
│ │ ├── file1_20210101.parquet
│ │ ├── file2_20210101.parquet
│ │ └── ...
│ ├── 2021/01/02
│ │ ├── file1_20210102.parquet
│ │ ├── file2_20210102.parquet
│ │ └── ...
│ └── ...
├── partition_2
│ ├── .hoodie_partition_metadata
│ ├── .hoodie_partition_metadata.json
│ ├── 2021/01/01
│ │ ├── file1_20210101.parquet
│ │ ├── file2_20210101.parquet
│ │ └── ...
│ ├── 2021/01/02
│ │ ├── file1_20210102.parquet
│ │ ├── file2_20210102.parquet
│ │ └── ...
│ └── ...
├── ...
└── .hoodie_partition_metadata
-
.hoodie
目录是 Hudi 表的核心目录,它包含了 Hudi 表的元数据和其他相关文件和目录 -
.temp
目录用于存储正在写入的数据 -
.tmp
目录用于存储已完成写入但尚未提交的数据 -
archive
目录用于存储归档数据 -
metadata
目录包含了所有分区的元数据信息 -
timeline.json
文件包含了表的时间轴信息 -
version
文件包含了表的版本信息 -
write.lock
文件用于控制并发写入
2.分区目录(Partition Directory)
分区目录是按照分区键组织的目录,每个分区目录下都包含了该分区下的所有数据文件和 .hoodie_partition_metadata
文件。
.hoodie_partition_metadata
文件包含了该分区的元数据信息,例如分区键、分区路径等。
3. 数据文件(Data File)
数据文件是 Hudi 表中实际存储数据的文件,通常采用 Apache Parquet 格式存储。每个数据文件都包含了数据记录,其中记录由多个列组成。列可以是原始类型(如整数和字符串)或复杂类型(如数组和嵌套结构)。
Hudi 核心概念
Copy-on-Write (写时复制)
Copy-on-Write
是 Hudi 最重要的概念之一。当 Hudi 写入数据时,它不会覆盖原有的数据,而是将新数据写入到新的文件中,然后通过元数据的方式将新旧数据进行关联,这种方式称为写时复制。这个过程保证了数据的一致性和可靠性。
Delta Stream
Delta Stream
是指数据的增量变化,Hudi 能够实时监控这些变化,并将它们存储为新的 Delta 文件。Delta Stream 可以实现多种格式的数据输入和输出,包括 Kafka、Flume、HDFS、S3 等。
Table
Table
是 Hudi 中数据存储的基本单元,每个 Table 都包含了一系列的数据文件和元数据文件。Table 可以支持多种数据格式,包括 Parquet、ORC 等。
Partition
Partition
是指将 Table 按照一定的规则划分为多个子集,每个子集称为一个 Partition。Partition 可以按照日期、地区等方式进行划分,以便更好地管理和查询数据。
Write Handle
Write Handle
是 Hudi 中用于写入数据的组件,它可以将数据写入到 Hudi Table 中,并将数据写入的过程进行优化。Write Handle 包括了多种优化技术,例如 Bloom Filter、Compaction 等。
Query Handle
Query Handle
是 Hudi 中用于查询数据的组件,它可以通过 SQL 或者 API 的方式查询数据。Query Handle 会自动将查询请求路由到正确的 Partition 和文件中,以便更快地检索数据。
Index
Index
是 Hudi 中用于优化数据查询性能的组件。它可以将数据中的某些字段进行索引,并将索引存储在内存中,以便更快地查询数据。
Hoodie Timeline
Hoodie Timeline
是 Hudi 中用于管理数据版本的组件。它可以将每个数据文件的元数据存储为一个时间轴,以便更好地跟踪数据的变化。Hoodie Timeline 还可以用于数据回滚和恢复操作。