Zhi Blog
  1. Hudi
Zhi Blog
  • Zhi Blog
  • LLM&RAG&Agent
    • agent+大数据
    • deepseek的指令
    • 大模型控制电脑
    • 10.开发llm的两种方式
    • 11.展示写一个网站
    • 12.展示写一个reactflow前端
    • 13.大模型在反复迭代场景中的应用举例
    • 14.agent开发的workflow流程和自主编排
    • 15.利用大模型实现提示词的优化
    • 16.这就是为啥要学习提示词工程
    • 提示技巧
    • 17.提示词通用技巧以及提示词工程框架介绍
    • 18.Unsloth 大模型微调工具
    • autogen starter
    • MCP1:about MCP
    • MCP2: 如何用langchain创建自己的MCP server&client
    • 十分钟系列
      • 1.十分钟实现免费本地大模型对话框
      • 2.十分钟在本地部署大模型
      • 3.十分钟实现本地大模型部署并部署对话应用
      • 4.十分钟实现本地知识库部署
      • 5.十分钟在本地实现Deepseek R1 70B免费对话
      • 6.十分钟实现本地可视化开发Agent
      • 7.待补充
    • 参考
      • AI最大赛道Agent机遇全解析
      • 从第一性原理看大模型Agent技术
      • Agent项目
      • LLama部署和微调手册
      • Agent实战-JSON结构化智能
      • AI智能体卷爆大模型!AutoGPT等4大Agent打擂,「西部世界」谁将成为软件2.0
      • Agent调研--19类Agent框架对比
      • 国内近 50 款 AI Agent 产品问世,技术足够支撑应用可靠性了吗
      • 解析 AI Agent 的发展现状和技术难点
      • 清华大学与智谱 AI 联合推出 CogAgent:基于多模态大模型的 GUI Agent,具备视觉问答、视觉定位等能力
      • Agent 还没出圈,落地先有了“阻力”:进入平台期,智力能否独立担事?
      • 钉钉卡位战:SaaS 挣不到的钱,Agent 会挣到
      • 近三代操作系统开发元老一起创业搞 AI Agent 操作系统
      • 从科幻走向现实,LLM Agent 做到哪一步了
  • Hudi
    • 1.hudi介绍和简单实践
    • 2.flink基于hudi的数据湖实践
    • 3.概说hudi
  • Iceberg
    • iceberg初步实践
  1. Hudi

3.概说hudi

通过比较理解hudi的特点#

hudi从字面上理解就是 Hadoop Upserts Deletes and Incrementals, 基于hadoop平台的,具备了插入,更新,和删除的功能。当然hive与hudi比较,hive也有插入,更新和删除的功能,hbase也有插入更新删除的功能。那么hudi和hive,hbase相比,怎么区分他的应用场景。
与hive相比
hudi的更新是记录级别的。hive是表或分区级别的,但凡有一条数据要更新,就需要重写整个表分区甚至整张表,而hudi是细化到单条记录的,为这些操作提供了数量级的优化。
与hbase相比
hbase是有排序的功能,这本身也可以理解为一种索引功能。hudi也有索引的数据结构,所以在应用的场景上来说,都可以用作实时数据处理。但是hudi可以利于hive的metastore,做到基于sql的实时处理。我们之前的做法是把批的sql逻辑拆解为java逻辑,利用hbase的实时更新的特性,做到数据的实时处理,而这些无疑大大增加的业务开发的难度。
增量处理(kafka)
hudi定位准实时处理,一方面我们需要用来实时查询一张表的最新数据,例如快照表的查询,另一方面,hudi也可以针对一段时间的增量数据进行处理,仅仅处理增量的更改,然后upsert或delete接下来的表。

通过架构定位hudi#

image.png
hudi的定位是在底层存储和计算引擎之间的位置,简单来说,hudi可以理解为一个索引层,他告诉计算引擎,如何更快的找到数据,也是对底层hdfs数据存储方式的再组织,如何存储真正的数据,方便更快的查找。
正式来讲,hudi充分利用了开源的列格式(Parquet)和行格式(Avro)的文件来存储数据,并在写入数据的同时生成特定的索引,进而提供更快的查询性能。这里的存储和索引,下面都会有介绍,这也是hudi的重点部分。
hdfs存储层由于上面的hudi存在,从而具备了实时存储的功能,不需要像以前那样,为了处理实时数据需要引入额外的存储组件,做到了流批在存储层面的一体化。

表设计#

image.png
从上图中看hudi的表设计由三部分组成:

Index#

hudi之所有有实时高效的upsert,关键就是索引机制,这点其实和hbase是一样的。
索引机制会讲RecodeKey+PartitionPath组合的形式作为唯一的标示映射到一个文件ID,而且这个唯一标示和文件/文件组之间的映射自写入文件组后就不会再改变。
hudi的索引有4种类型6个实现类,均继承自抽象类HoodieIndex
image.png
⚠️注意
全局索引:会强制在所有分区的范围内保证键的唯一性,这样会使得更新和删除的操作随着表越来越大而消耗也越来越多,所以适合于在小表设置
非全局索引:仅在表的某一分区内保证键的唯一性,可以很好适应写入量的扩展。

DataFile#

hudi讲DFS上的数据集组织到基本路径(HoodieWriteConfig.BASE_PATH_PROP)下的目录结构中,数据集分为多个分区(DataSourceOptions.PARTITIIONPATH_FIELD_OPT_KEY)
image.png
在每个分区内,文件被组织称文件组,由文件id充当唯一标识。每个文件组包含多个文件切片,其中的每个切片包含在某个即时时刻的提交/压缩生成的.parquet文件以及一组日志文件.log,该文件包含自生成.parquet文件的插入/更新,压缩操作讲log文件和parquet文件合并以产生新的文件切片,清理操作则将未使用的或较旧的文件切片删除回收DFS空间。
image.png

时间轴#

时间轴是hudi设计中最核心的特性,每一次对表的操作(增删改)都会在时间轴上创建一个即时时间(instant time),从而可以实现仅查询某个时间点之后成功提交的数据,或某个时间点之前成功提交的数据,有效避免扫描更大时间范围的数据。
image.png

表类型#

COW表#

cow表在写入的时候是直接写入parquet文件,在写入数据的时候,执行同步合并的操作。
更新:hudi在更新数据的时候,会找到包含最新数据的文件,然后再使用最新值来重写该文件,含有其他记录的文件保持不变,当有突然大量的写入的时候会有大量的重写操作,从而有很大的IO开销。
读取:通过读取含有最新数据的文件,此存储方式舍写少读多的场景。
image.png

MOR表#

mor表是cow表的升级版,它使用parquet文件和avro文件混合的方式存储数据
更新:在更新记录时,仅更新到avro文件中,然后进行异步(或同步)的compaction,最后创建列式文件parquet的新版本。此存储方式适合大量的写入操作。
读取:在读取的时候需要将增量文件和旧文件进行合并,然后生成列式文件后再进行查询。一般会消耗几分钟的时间。
image.png
修改于 2025-03-20 05:45:24
上一页
2.flink基于hudi的数据湖实践
下一页
iceberg初步实践
Built with