Hudi 文件格式分析

news/2025/12/3 22:39:22/文章来源:https://www.cnblogs.com/wasp520/p/19304240

Hudi 文件格式分析

请关注微信公众号:阿呆-bot

主题说明

Hudi 支持多种文件格式来存储数据,不同的格式有不同的特点和适用场景。理解文件格式的选择和使用,有助于优化存储和查询性能。

Hudi 主要使用两种文件格式:

  • Parquet:用于基础文件(BaseFile),列式存储,查询性能好
  • Avro:用于增量日志(LogFile),行式存储,写入性能好

另外还支持 ORC 作为基础文件的替代选择,以及 HFile 用于元数据表。

细化内容

Parquet 格式 - 基础文件

Parquet 是列式存储格式,特别适合分析型查询。Hudi 使用 Parquet 作为基础文件的默认格式。

Parquet 的特点:

  • 列式存储:相同列的数据存储在一起,压缩率高
  • 谓词下推:可以直接在文件层面过滤数据,减少IO
  • 投影下推:只读取需要的列,减少数据传输
  • 压缩效率高:列式存储天然适合压缩

在 Hudi 中的使用:

  • 基础文件(BaseFile)默认使用 Parquet
  • 文件名格式:{fileId}_{commitTime}.parquet
  • 支持 Schema 演化,可以添加新列

Avro 格式 - 增量日志

Avro 是行式存储格式,特别适合增量写入。Hudi 使用 Avro 作为增量日志的格式。

Avro 的特点:

  • 行式存储:一条记录的所有字段存储在一起
  • Schema 驱动:Schema 和数据分离,支持 Schema 演化
  • 紧凑的二进制格式:比 JSON 等文本格式更省空间
  • 写入性能好:追加写入效率高

在 Hudi 中的使用:

  • 增量日志(LogFile)使用 Avro
  • 日志文件包含多个数据块(Data Block)
  • 每个数据块可以包含多条记录

ORC 格式 - 替代选择

ORC(Optimized Row Columnar)是另一种列式存储格式,可以作为 Parquet 的替代。

ORC 的特点:

  • 列式存储:类似 Parquet
  • 支持 ACID 事务:原生支持更新和删除
  • 压缩率高:使用多种压缩算法
  • Hive 集成好:Hive 原生支持 ORC

在 Hudi 中的使用:

  • 可以作为基础文件的格式选择
  • 通过配置 hoodie.table.base.file.format=ORC 启用

HFile 格式 - 元数据表

HFile 是 HBase 的文件格式,Hudi 用它来存储元数据表。

HFile 的特点:

  • 键值存储:适合存储键值对数据
  • 排序存储:键按顺序存储,查找效率高
  • 支持 Bloom Filter:快速判断键是否存在

在 Hudi 中的使用:

  • 元数据表使用 HFile 格式
  • 存储文件列表、列统计等元数据信息

关键技术

文件格式的选择策略

Hudi 根据表类型选择文件格式:

Copy-on-Write 表:

  • 基础文件:Parquet(默认)或 ORC
  • 没有日志文件,每次更新都重写基础文件

Merge-on-Read 表:

  • 基础文件:Parquet(默认)或 ORC
  • 日志文件:Avro 格式
  • 查询时需要合并基础文件和日志文件

文件格式的读写器

Hudi 通过 HoodieIOFactory 来获取不同格式的读写器:

  • ParquetFileFormatUtils:Parquet 格式的读写工具
  • AvroFileFormatUtils:Avro 格式的读写工具
  • ORCFileFormatUtils:ORC 格式的读写工具

这些工具类封装了格式特定的读写逻辑。

Schema 演化支持

Hudi 支持 Schema 演化,可以在不重写数据的情况下添加新列:

  • Parquet:支持添加新列,向后兼容
  • Avro:支持 Schema 演化,通过 Schema Registry 管理
  • ORC:支持添加新列

Schema 演化时,旧数据的新列会使用默认值。

压缩和编码

不同格式使用不同的压缩和编码策略:

  • Parquet:支持 Snappy、Gzip、LZO 等压缩算法
  • Avro:支持 Deflate、Snappy 等压缩算法
  • ORC:支持 Zlib、Snappy、LZO 等压缩算法

压缩算法的选择影响压缩率和压缩速度。

关键对象说明

类关系图

image.png

关键类说明

  • HoodieFileFormat:文件格式枚举,定义了支持的格式类型。
  • HoodieIOFactory:IO 工厂类,根据存储和格式获取对应的工具类。
  • FileFormatUtils:文件格式工具抽象类,定义了序列化和反序列化的接口。
  • ParquetFileFormatUtils:Parquet 格式工具类,处理 Parquet 文件的读写。
  • AvroFileFormatUtils:Avro 格式工具类,处理 Avro 文件的读写。
  • HoodieLogFormat:日志文件格式接口,定义了日志文件的读写接口。
  • HoodieAvroDataBlock:Avro 数据块,日志文件中的数据块实现。

关键操作时序图

下面是一个文件读取操作的时序图,展示了如何读取 Parquet 基础文件和 Avro 日志文件:
image.png

代码示例

读取 Parquet 文件

// 获取 IO 工厂
HoodieIOFactory ioFactory = HoodieIOFactory.getIOFactory(storage);// 获取 Parquet 格式工具
FileFormatUtils parquetUtils = ioFactory.getFileFormatUtils(HoodieFileFormat.PARQUET);// 读取基础文件
HoodieBaseFile baseFile = fileSlice.getBaseFile().get();
List<HoodieRecord> records = parquetUtils.deserializeRecordsFromLogBlock(storage,baseFile.getPath(),schema
);

写入 Avro 日志文件

// 获取 Avro 格式工具
FileFormatUtils avroUtils = ioFactory.getFileFormatUtils(HoodieFileFormat.HOODIE_LOG);// 序列化记录到日志块
ByteArrayOutputStream outputStream = avroUtils.serializeRecordsToLogBlock(storage,records,schema,keyFieldName,paramsMap
);// 写入日志文件
HoodieLogFileWriter writer = HoodieLogFormat.newWriterBuilder().withStorage(storage).withLogFile(logFile).build();
writer.appendBlock(outputStream.toByteArray());

配置文件格式

// 配置基础文件格式为 ORC
HoodieWriteConfig config = HoodieWriteConfig.newBuilder().withPath(basePath).withBaseFileFormat(HoodieFileFormat.ORC).build();

总结

Hudi 支持多种文件格式,每种格式都有其适用场景。核心要点:

  1. Parquet 是基础文件的默认格式,列式存储,查询性能好
  2. Avro 是日志文件的格式,行式存储,写入性能好
  3. ORC 可以作为 Parquet 的替代,在某些场景下性能更好
  4. HFile 用于元数据表,键值存储,查找效率高
  5. 文件格式选择 影响存储效率和查询性能
  6. Schema 演化 支持在不重写数据的情况下添加新列

理解文件格式有助于优化 Hudi 表的存储和查询性能,选择合适的格式可以显著提升系统效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/986113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ai故事生成报告 - f

软件构造实验作业 实验名称:儿童故事管理平台的开发 实验一:AI故事生成平台 一、实验要求 实验名称: AI故事生成平台 - 核心数据模型与文本生成 核心任务: 构建平台的后端核心,实现基于关键词的自动故事生成。 任…

落山基唬人队-冲刺总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/13559这个作业的目标 冲刺计划与冲…

深入解析:微信小程序通过关联公众号发送待办消息:实战指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

团队作业4

作业基本信息项目 内容这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework…

生命是一树花开

生命是一树花开 余秋雨生命,是一树花开,或安静或热烈,或寂寞或璀璨。日子,在岁月的年轮中依次厚重,那些天真的、跃动的、抑或沉思的灵魂,在繁华与喧嚣中,被刻上深深浅浅的印痕。很欣赏这样一句话:生命,是一场…

深入解析:【5】理解GUID和Handle:解锁UEFI驱动和应用程序的钥匙

深入解析:【5】理解GUID和Handle:解锁UEFI驱动和应用程序的钥匙pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

JavaSE--面向对象

JavaSE--面向对象JavaSE--面向对象 1. 面向过程 & 面向对象 面向过程思维面向过程思维--步骤清晰,第一步,第二部...适合处理一些简单的问题。顺序结构面向对象思维物以类聚,分类思维模式。解决问题把总的分类分…

歌声转换SVC主流方法原理剖析4 — ReFlow-VAE-SVC

pre 本文SVC指的是歌声转换(Singing Voice Conversion (SVC)),例如常见且开源的 So-VITS-SVC, RVC, DDSP-SVC 关键词:歌声转换、声音克隆、AI翻唱 本来是不打算写ReFlow-VAE-SVC的,不过实在是对名字里面那个VAE很…

重练算法(代码随想录版) day29 - 贪心part3

今日刷题量:4 当前刷题总量:121 Easy: 56 Mid: 59 Hard: 6 Day29 算法思想 1.对于134题,核心思路就是把 diff[i] = gas[i] - cost[i] 当成一段路的净收益,问有没有起点能让前缀和始终不负,并且总和≥0。 2.对于13…

RocketMQ消息积压

一、概述 在分布式系统架构中,RocketMQ作为主流消息中间件,承担着业务解耦、流量削峰、异步通信的核心职责。但消息积压是其运行过程中高频出现的问题,一旦发生,轻则导致业务响应延迟(如订单状态同步慢、通知推送…

spring的三级缓存及二三级缓存解决的问题 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

个人学习匿名内部类转lambda表达式转方法引用运算符的一个记录 - 亚麻青

首先我先来讲一下匿名内部类。 匿名内部类是内部类的一种,他的特点是无名字,直接进行实例化操作,最常见的就是接口和/抽象类的实例化。 使用条件:1、必须继承一个类或者实现一个接口。2、只能实现单继承。3、必须创…

函数指针与函数对象

函数指针与函数对象一、函数指针是什么? 函数指针的定义:在 C++ 中就是指向函数的指针变量,类型为 返回值类型(*)(参数类型列表),它保存的是函数的地址。通过函数指针,你可以动态调用指针指向的函数,实现更灵活的…

敏捷冲刺日志 - Day 5

敏捷冲刺日志 - Day 5 站立会议 站立时会议改为线上进行。昨天已完成的工作:saveVideoToGallery 功能已实现并测试通过。 初步定位了“替换”闪退问题的原因是 SecurityException。今天计划完成的工作:核心任务:尝试修…

12月3日日记

1.今天学习java web以及数据结合的复习 2.明天体育课打比赛 3.如何配置 StringRedisTemplate 和 RedisTemplate 的序列化(避免乱码 + 支持对象存储)?

第五篇Scrum冲刺博客

每日Scrum报告 日期: 2025-11-30 会议时间: 09:00 1. 当日站立式会议记录 会议照片成员同步内容 成员:齐思贤昨天已完成的工作:开发个人资料查询接口(GET /api/v1/users/me),返回用户详情(含review_count/coll…

敏捷冲刺日志 - Day 6

敏捷冲刺日志 - Day 6 站立会议 站立时会议改为线上进行。昨天已完成的工作:编写了兼容 Android 10 和 Android 11+ 的文件删除逻辑。 测试发现 Android 10 的 RecoverableSecurityException 方案不稳定。今天计划完成…

深入解析:Spring Kafka消费者被踢出组?CommitFailedException异常全面解析与解决方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

OWASP Java HTML 清理库曝出 XSS 漏洞:noscript 与 style 标签组合成隐患

OWASP Java HTML Sanitizer 库在某些特定策略配置下(允许 noscript 和 style 标签并允许 style 标签内含文本),存在跨站脚本漏洞。攻击者可构造特殊载荷绕过清理,导致 XSS 攻击。CVE-2025-66021:OWASP Java HTML …

敏捷冲刺日志 - Day 4

敏捷冲刺日志 - Day 4 站立会议 站立时会议改为线上进行。昨天已完成的工作:实现了视频的多选和队列压缩功能。 UI 可以正确显示批量压缩的进度。今天计划完成的工作:新功能:实现“保存到相册”功能,确保用户压缩的视…