04. Hudi 元数据管理分析
主题说明
元数据管理是 Hudi 的重要组成部分,它管理表的配置、Schema、分区信息等。理解元数据管理有助于理解表的生命周期和配置管理。
Hudi 的元数据包括:
- 表配置:存储表的类型、格式、分区字段等配置
- Schema 信息:存储表的数据结构定义
- 分区信息:存储分区路径和元数据
- 元数据表:内部表,存储文件列表等元数据
细化内容
HoodieTableMetaClient - 元数据客户端
HoodieTableMetaClient 是元数据管理的核心类,它提供了访问表元数据的接口。
主要功能:
- 加载表配置 :从
hoodie.properties文件加载配置 - 管理 Timeline:提供活动 Timeline 和归档 Timeline
- Schema 管理 :通过
TableSchemaResolver管理 Schema - 存储访问:封装存储操作,访问元数据目录
元数据目录结构:
.hoodie/
├── hoodie.properties # 表配置
├── timeline/ # Timeline 文件
└── metadata/ # 元数据表(可选)
HoodieTableConfig - 表配置管理
HoodieTableConfig 管理表的配置信息,配置存储在 hoodie.properties 文件中。
主要配置项:
- 表类型:COPY_ON_WRITE 或 MERGE_ON_READ
- 表名:表的唯一标识
- 基础文件格式:Parquet、ORC 等
- 日志文件格式:Avro 等
- 分区字段:分区路径的字段列表
- 键生成器:记录键的生成方式
配置的读写:
- 读取:从
hoodie.properties文件加载 - 写入:更新
hoodie.properties文件 - 验证:检查配置的有效性
Schema 管理
Hudi 通过 TableSchemaResolver 管理 Schema,支持 Schema 演化。
Schema 的来源:
- 写入 Schema:写入时指定的 Schema
- 数据文件 Schema:从数据文件中读取的 Schema
- 表 Schema:表的当前 Schema
Schema 演化:
- 添加列:可以在不重写数据的情况下添加新列
- 类型兼容:支持某些类型之间的转换
- 向后兼容:旧数据可以兼容新 Schema
分区信息管理
Hudi 通过 HoodiePartitionMetadata 管理分区信息。
分区元数据:
- 分区路径:分区的路径信息
- 分区值:分区的值列表
- 文件列表:分区下的文件列表
分区元数据文件:
- 每个分区可以有一个元数据文件
- 存储分区的统计信息
- 支持快速分区发现
元数据表(Metadata Table)
元数据表是 Hudi 的内部表,用于存储表的元数据信息。
元数据表的作用:
- 文件列表:存储所有文件的列表,避免扫描文件系统
- 列统计:存储列的统计信息,用于查询优化
- 分区信息:存储分区信息,加速分区发现
元数据表的格式:
- 使用 HFile 格式存储
- 键值对结构,查找效率高
- 支持增量更新
关键技术
配置的持久化
表配置存储在 hoodie.properties 文件中,使用 Properties 格式:
properties
hoodie.table.type=COPY_ON_WRITE
hoodie.table.name=my_table
hoodie.table.base.file.format=PARQUET
hoodie.datasource.write.partitionpath.field=partition
配置的读写是原子操作,保证一致性。
Schema 的版本管理
Hudi 支持 Schema 版本管理:
- 每个 Commit 可以有不同的 Schema
- Schema 信息存储在 Commit Metadata 中
- 查询时根据时间点选择对应的 Schema
元数据表的更新
元数据表在每次 Commit 时更新:
- 增量更新文件列表
- 更新列统计信息
- 更新分区信息
更新是异步的,不影响主表的写入性能。
配置的验证
Hudi 在加载配置时会进行验证:
- 检查必需配置是否存在
- 验证配置值的有效性
- 检查配置之间的依赖关系
关键对象说明
类关系图

关键类说明
- HoodieTableMetaClient:元数据客户端,提供访问表元数据的接口。它是元数据管理的入口。
- HoodieTableConfig :表配置管理类,负责读写表配置。配置存储在
hoodie.properties文件中。 - TableSchemaResolver:Schema 解析器,负责解析和管理表的 Schema。支持从多个来源获取 Schema。
- HoodiePartitionMetadata:分区元数据管理类,负责管理分区的元数据信息。
- HoodieMetadataTable:元数据表,存储表的元数据信息,如文件列表、列统计等。
关键操作时序图
下面是一个表初始化的时序图,展示了如何创建表和加载元数据:

代码示例
创建表和初始化配置
java
// 创建表配置
Properties props = new Properties();
props.setProperty("hoodie.table.type", "COPY_ON_WRITE");
props.setProperty("hoodie.table.name", "my_table");
props.setProperty("hoodie.table.base.file.format", "PARQUET");
props.setProperty("hoodie.datasource.write.partitionpath.field", "partition");
// 初始化表
HoodieTableMetaClient metaClient = HoodieTableMetaClient.builder()
.setConf(hadoopConf)
.setBasePath(basePath)
.setTableType(HoodieTableType.COPY_ON_WRITE)
.setTableName("my_table")
.initTable(hadoopConf, basePath);
读取表配置
java
// 加载元数据客户端
HoodieTableMetaClient metaClient = HoodieTableMetaClient.builder()
.setConf(hadoopConf)
.setBasePath(basePath)
.build();
// 获取表配置
HoodieTableConfig tableConfig = metaClient.getTableConfig();
HoodieTableType tableType = tableConfig.getTableType();
String tableName = tableConfig.getTableName();
HoodieFileFormat baseFormat = tableConfig.getBaseFileFormat();
管理 Schema
java
// 获取 Schema 解析器
TableSchemaResolver schemaResolver = new TableSchemaResolver(metaClient);
// 获取表的 Schema
Schema tableSchema = schemaResolver.getTableAvroSchema();
// 从数据文件获取 Schema
Schema dataFileSchema = schemaResolver.getTableAvroSchemaFromDataFile();
// 从 Commit Metadata 获取 Schema
Schema commitSchema = schemaResolver.getTableAvroSchemaFromCommitMetadata("20230101120000");
访问元数据表
java
// 获取元数据表
HoodieMetadataTable metadataTable = HoodieMetadataTable.create(
context,
metaClient.getStorage(),
metaClient.getMetadataConfig(),
basePath
);
// 获取文件列表
List<String> files = metadataTable.getFileList("2023/01/01");
// 获取列统计
ColumnStats columnStats = metadataTable.getColumnStats(
"2023/01/01",
"age"
);
总结
元数据管理是 Hudi 的基础设施,它管理表的配置、Schema、分区等信息。核心要点:
- HoodieTableMetaClient 是元数据管理的入口,提供访问表元数据的接口
- HoodieTableConfig 管理表配置,配置存储在
hoodie.properties文件中 - TableSchemaResolver 管理 Schema,支持 Schema 演化
- HoodiePartitionMetadata 管理分区元数据
- 元数据表 存储文件列表等元数据,加速查询
- 配置持久化 使用 Properties 文件,保证一致性
理解元数据管理有助于理解表的生命周期和配置管理,是使用 Hudi 的基础。