Hudi系列3:Hudi核心概念

news2025/1/19 20:18:09

文章目录

  • Hudi架构
  • 一. 时间轴(TimeLine)
    • 1.1 时间轴(TimeLine)概念
    • 1.2 Hudi的时间线由组成
    • 1.3 时间线上的Instant action操作类型
    • 1.4 时间线上State状态类型
    • 1.5 时间线官网实例
  • 二. 文件布局
  • 三. 索引
    • 3.1 简介
    • 3.2 对比Hive没有索引的区别
    • 3.3 Hudi索引类型
    • 3.4 全局索引与非全局索引
  • 四. 表类型
    • 4.1 COW:(Copy on Write)写时复制表
      • 4.1.1 概念
      • 4.1.2 COW工作原理
      • 4.1.3 COW表对表的管理方式改进点
      • 4.2 MOR:(Merge on Read)读时复制表
      • 4.2.1 概念
      • 4.2.2 MOR表工作原理
    • 4.3 总结了两种表类型之间的权衡
  • 五. 查询类型
    • 5.1 Snapshot Queries
    • 5.2 Incremental Queries
    • 5.3 Read Optimized Query
  • 参考:

Hudi架构

image.png

一. 时间轴(TimeLine)

1.1 时间轴(TimeLine)概念

Hudi的核心是维护在不同时刻(Instant)在表上执行的所有操作的时间轴,提供表的即时视图,同时还有效地支持按时间顺序检索数据
image.png

1.2 Hudi的时间线由组成

Instant action:
在表上执行的操作类型

Instant time:
即时时间,通常是一个时间戳,它按照action的开始时间单调递增

State:
时刻的当前状态

1.3 时间线上的Instant action操作类型

hudi保证在时间线上的操作都是基于即时时间的,两者的时间保持一致并且是原子性的

  1. commits: 表示将一批数据原子写入表中

  2. cleans: 清除表中不在需要的旧版本文件的后台活动。

  3. delta_commit:增量提交是指将一批数据原子性写入MergeOnRead类型的表中,其中部分或者所有数据可以写入增量日志中。

  4. compaction: 协调hudi中差异数据结构的后台活动,例如:将更新从基于行的日志文件变成列格式。在内部,压缩的表现为时间轴上的特殊提交。

  5. rollback:表示提交操作不成功且已经回滚,会删除在写入过程中产生的数据

  6. savepoint:将某些文件标记为“已保存”,以便清理程序时不会被清楚。在需要数据恢复的情况下,有助于将数据集还原到时间轴上某个点。

1.4 时间线上State状态类型

任何给定的瞬间都可以处于以下状态之一

  1. requested:表示一个动作已被安排,但尚未启动

  2. inflight:表是当前正在执行操作

  3. completed:表是在时间线上完成了操作

1.5 时间线官网实例

image.png

上图中采用时间(小时)作为分区字段,从 10:00 开始陆续产生各种 commits,10:20 来了一条 9:00 的数据,该数据仍然可以落到 9:00 对应的分区,通过 timeline 直接消费 10:00 之后的增量更新(只消费有新 commits的 group),那么这条延迟的数据仍然可以被消费到,(没有说明白它是怎么处理延迟数据的)

二. 文件布局

Hudi将一个表映射为如下文件结构:
image.png

  1. Hudi将HDFS上的数据集组织到基本路径(HoodieWriteConfig.BASEPATHPROP)下的目录结构中。

  2. 数据集分为多个分区(DataSourceOptions.PARTITIONPATHFIELDOPT_KEY),这些分区与Hive表非常相似,是包含该分区的数据文件的文件夹。

  3. 数据集分为多个分区(DataSourceOptions.PARTITIONPATHFIELDOPT_KEY),这些分区与Hive表非常相似,是包含该分区的数据文件的文件夹。

image.png

  1. Hudi将数据表组织成分布式文件基本路径(basepath)下的目录结构。

  2. 表被划分为多个分区,这些分区是包含该分区的数据文件的文件夹,非常类似于Hive表

  3. 在每个分区中,文件被组织成文件组,由文件ID唯一标识

  4. 每个文件组包含几个文件片(FileSlice)

  5. 每个文件包含:
    5.1) 一个基本文件(.parquet): 在某个commit/compaction 即时时间(instant time)生成的(MOR可能没有)
    5.2) 多个日志文件(.log*),这些日志文件包含自生成基本文件以来对基本文件的插入/更新(COW没有).

  6. Hudi采用了多版本并发控制(Multiversion Concurrency Control,MVCC)
    6.1) compaction 操作: 合并日志和基本文件以产生新的文件片
    6.2) clean操作: 清楚不使用的/旧的文件以回收文件系统上的空间

  7. Hudi的base file(parquet 文件)在 footer 的 meta 去记录了 record key组成的BloomFilter,用于在flie based index 的实现中实现高效率的 key contains 检测。 只有不在 BloomFilter的key才需要扫描整个文件消灭假阳。

  8. Hudi的log(avro 文件)是自己编码的,通过积攒数据 buffer 以LogBlock为单位写出,每个LogBlock包含 magic number、size、content、footer等信息,用于数据读、校验和过滤。

三. 索引

3.1 简介

Hudi 通过索引机制将给定的 hoodie 键(记录键 + 分区路径)一致地映射到文件 id,从而提供高效的 upsert。记录键和文件组/文件 id 之间的这种映射,一旦记录的第一个版本被写入文件,就永远不会改变。简而言之,映射文件组包含一组记录的所有版本(类似git)。

3.2 对比Hive没有索引的区别

对于Copy-On-Write 表,这可以实现快速 upsert/delete 操作,避免需要连接整个数据集以确定要重写哪些文件。对于Merge-On-Read 表,这种设计允许 Hudi 绑定任何给定基本文件需要合并的记录数量。具体来说,给定的基本文件只需要针对作为该基本文件一部分的记录的更新进行合并。相反,没有索引组件的设计 Hive ACID需要将所有基本文件与所有传入的更新/删除记录合并
image.png

3.3 Hudi索引类型

image.png

3.4 全局索引与非全局索引

Bloom 和 simple index 都有全局选项,Base 索引本质上是一个全局索引

hoodie.index.type=GLOBAL_BLOOM
hoodie.index.type=GLOBAL_SIMPLE
  1. 全局索引:在全表的所有分区范围下强制要求键保持唯一,即确保对给定的键有且只有一个对应的记录。

  2. 非全局索引:仅在表的某一个分区内强制要求键保持唯一,它依靠写入器为同一个记录的更删提供一致的分区路。

四. 表类型

4.1 COW:(Copy on Write)写时复制表

4.1.1 概念

Copy on Write表中的文件切片仅包含基本列文件,并且每次提交都会生成新版本的基本文件。换句话说,每次提交操作都会被压缩,以便存储列式数据,因此Write Amplification写入放大非常高(即只有一个字节的数据被提交修改,我们也需要先copy改值所在的最小单位块复制到内存整体修改再写会去),而读取数据成本则没有增加,所以这种表适合于做分析工作,读取密集型的操作。

4.1.2 COW工作原理

image.png

当数据被写入,对现有文件组的更新会为该文件组生成一个带有提交即时间标记的新切片,而插入分配一个新文件组并写入该文件组第一个切片。这些切片和提交即时时间在上图用同一颜色标识。针对图上右侧sql查询,首先检查时间轴上的最新提交并过滤掉之前的旧数据(根据时间查询最新数据),如上图所示粉色数据在10:10被提交,第一次查询是在10:10之前,所以不会出现粉色数据,第二次查询时间在10:10之后,可以查询到粉色数据(以被提交的数据)。

4.1.3 COW表对表的管理方式改进点

  1. 在原有文件上进行自动更新数据,而不是重新刷新整个表/分区

  2. 能够只读取修改部分的数据,而不是浪费查询无效数据

  3. 严格控制文件大小来保证查询性能(小文件会显著降低查询性能)

4.2 MOR:(Merge on Read)读时复制表

4.2.1 概念

Merge on Read表使用列式存储(parquet)+行式文件(arvo)存储数据,它仍然支持只查询文件切片中的基本列(parquet)来对表进行查询优化。用户每次对表文件的upsert操作都会以增量写入delta log(avro),增量日志会对应每个文件最新的ID来帮助用户完成快照查询。因此这种表类型,能够智能平衡读取和写放大(wa),提供近乎实时的数据。这种表最重要的是合并压缩,它用来选择将对应delta log数据合并压缩到表的基本文件中,来保持查询时的性能(较大的增量日志文件会影响合并时间和查询时间)(通俗说就是你修改新增的值存在一个avro格式文件中,等你要查询的时候就好去和原有的值进行合并操作返回唯一值,不过MOR表会定期自动合并)

Merge on Read 读时合并
第一批数据,没有Parquet文件,写入到log文件
后期会compaction,执行合并的时候,将Parquet+log合并为新的
Parquet。(有点类似关系型数据库的WAL)

4.2.2 MOR表工作原理

image.png

  1. 如上图所示,可以做到每一分钟提交一次写入操作

  2. 查询表的方式有两种,Read Optimized query和Snapshot query,取决于我们选择是要查询性能还是数据最新

  3. 如上图所示,Read Optimized query查询不到10:05之后的数据(查询不到增量日志里的数据,没有合并到base文件),而Snapshot query则可以查询到全量数据(基本列数据+行式的增量日志数据)

4.3 总结了两种表类型之间的权衡

image.png

五. 查询类型

Hudi支持如下三种查询类型:

5.1 Snapshot Queries

image.png

5.2 Incremental Queries

增量查询,可以查询给定 commit/delta commit 即时操作以来新写入的数据。 有效的提供变更流来启用增量数据管道。

5.3 Read Optimized Query

读优化查询,可查看给定的 commit、compact 即时操作的表的最新的快照。 仅将最新文件片的基本/列文件暴露给查询,并保证与非Hudi表相同的列查询性能。

参考:

  1. https://hudi.apache.org/docs/overview/
  2. https://www.bilibili.com/video/BV1ue4y1i7na/
  3. https://blog.csdn.net/NC_NE/article/details/125019619
  4. https://yangshibiao.blog.csdn.net/article/details/123123624

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

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

相关文章

数学建模-回归分析(Stata)

注意:代码文件仅供参考,一定不要直接用于自己的数模论文中国赛对于论文的查重要求非常严格,代码雷同也算作抄袭 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231 //清风数学建模 一、基础知识 1.简介 …

不得不面对的随机MAC问题

一、现状 为了完善安全机制、保护用户隐私,各个设备厂商开发了 MAC 地址随机功能,防止用户信息泄露。随机 MAC 地址,就是一个随机生成的伪 MAC 地址,一个假 MAC 地址,使用随机 MAC 地址进行网络通信,而不是…

全网圣诞树最全完整源码下载合集【可下载】

文章目录一、全部源码打包下载:二、效果预览001-html版本 豪华动态圣诞树 抖音同款002-圣诞树灯光跟随音乐节拍一起呼吸点亮下雪动画效果代码003-圣诞树彩带飘动节日快乐效果代码004-圣诞树带音乐旋转拉伸动画效果005-python版本python取消延迟秒出图版 【全网最强无…

当FutureTask遇上DiscardPolicy,有坑

文章目录有啥坑呢?知识回顾问题触发条件问题复现问题分析问题修复扩展哈喽,你好,我是余数。今天来了解下当 FutureTask 遇上 DiscardPolicy 或 DiscardOldestPolicy 时容易掉的坑,然后分析分析问题产生的原因以及如何规避这类问题…

LVS+Keepalived+Nginx具体配置步骤

视频链接:4-6 搭建LVS-DR模式- 为两台RS配置虚拟IP_哔哩哔哩_bilibili 视频笔记链接:笔记 一、服务器与Ip约定 LVS DIP: 192.168.1.151 VIP: 192.168.1.150 Nginx1 RIP: 192.168.1.171 VIP: 192.168.1.150 Nginx2 RIP: 192.168.1.172 VIP: 192.168…

力扣 2283. 判断一个数的数字计数是否等于数位的值

题目 给你一个下标从 0 开始长度为 n 的字符串 num &#xff0c;它只包含数字。 如果对于 每个 0 < i < n 的下标 i &#xff0c;都满足数位 i 在 num 中出现了 num[i]次&#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 示例 输入&#xff1a;num “1…

vue文件上传

vue文件上传 前言 今天写一篇关于文件上传的文章&#xff0c;其实对于真正工作的人来说&#xff0c;这不是很难的事&#xff0c;但对于新手来说无疑是个新技术 实现功能如下图 根据上传文件类型显示对应文件类型&#xff0c;图片直接显示&#xff0c;当然图片特可以做对应类型…

【NI Multisim 14.0原理图设计基础——参数属性设置】

目录 序言 &#x1f46c;一、参数属性设置 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0&#xff0c;打开如图所示的启动界面&#xff0c;完成初始化后&…

初始C语言-分支与循环语句

目录 一、语句 1. 什么是语句&#xff1f; C语句可分为以下五类&#xff1a; 1. 表达式语句 2. 函数调用语句 3. 控制语句 4. 复合语句 5. 空语句 2. 控制语句&#xff1a; 1. 条件判断语句也叫分支语句&#xff1a;if语句、switch语句&#xff1b; 2. 循环执行语句…

extern “C“的作用以及c/c++代码互调

一、目的相信从事嵌入开发的小伙伴肯定遇到过使用第三库的情景&#xff0c;有时候可能是C中调用C库&#xff0c;有时候可能又是C中调用C库&#xff1b;如果你遇到过&#xff0c;那你肯定知道extern "C"的作用.本篇的目的就是给大家介绍C/C互相调用的原理和实践。二、…

RK3588平台开发系列讲解(内核调试篇)CPU Hotplug 调试

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、CPU Hotplug 介绍二、CPU Hotplug 内核开关三、sysfs调试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢多核系统底层驱动提供了cpu的Plugin/Unplug接口,可以实现动态调整cpu使用运行。 一、CPU Hotplu…

在 Node JS 中实现微服务架构

&#x1f4cd;简介&#x1f642; 正如我们在之前的博客“单体与微服务&#xff1a;一种实用方法”中讨论的那样。但是今天我们要在 NodeJS 中实现微服务架构。&#x1f449; 您可以使用任何技术&#xff0c;如 Spring、Python 等。但我们将使用 NodeJS 进行演示。&#x1f4cd;…

PostgreSQL下载、安装和配置使用

1&#xff09;下载 PostgreSQL官网下载&#xff1a;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 2&#xff09;安装 双击运行安装包 选择安装目录&#xff0c;不推荐安装在C盘。 选择需要安装的服务&#xff0c;不明白是啥的全选就行&#xf…

内含JAVA简单概括和JAVA所需安装的软件和详细教程,想学习JAVA无从下手,这篇文章带你迈出第一步

本文大致概括了JAVA编程语言的简史和特点,主要介绍了JAVA开发环境安装,涉及JDK,Sublime Text IntelliJ IDEA三个软件的简单介绍,安装和使用,最后编写了第一个JAVA代码,保姆级教学,跟着文章一步步来,迈出你学习JAVA的第一步吧! 初识JAVA一.JAVA语言简介二.JAVA发展简史三.JAVA语…

通过模拟器实现APP抓包

本教程将跳过工具安装部分&#xff0c;请正确食用&#x1f609;我的环境&#xff1a;操作系统&#xff1a;win11模拟器版本&#xff1a;雷电安卓模拟器稳定版-安卓7.1(32位) V5.0.46抓包工具&#xff1a;Wireshark-Version 4.0.1抓包工具&#xff1a;charles-Version 4.6.3工具…

SpringMVC(十一):SpringMVC文件上传中要解决的问题

文章目录 SpringMVC文件上传中要解决的问题 一、中文文件名编码问题 二、文件位置存储问题

【YOLO系列】YOLOv8算法(尖端SOTA模型)

前言回顾 在这里粗略回顾一下YOLOv5&#xff0c;这里直接提供YOLOv5的整理的结构图吧 Backbone&#xff1a;CSPDarkNet结构&#xff0c;主要结构思想的体现在C3模块&#xff0c;这里也是梯度分流的主要思想所在的地方&#xff1b;PAN-FPN&#xff1a;双流的FPN&#xff0c;必…

Linux——常用命令1.

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;linux &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;Linux常用命令 目录 …

Centos7安装JDK1.8(OracleJDK8)

Linux安装JDK1.8 | OracleJDK8Linux安装JDK1.8(OracleJDK8)卸载openJDK官网下载OracleJDK8解压JDK到指定目录配置JDK变量查看jdk是否可用Linux安装JDK1.8(OracleJDK8) Hadoop官方的JDK要求https://cwiki.apache.org/confluence/display/HADOOP/HadoopJavaVersions JDK变量配置…

Java——》下载Hotspot 虚拟机源码

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Java——》下载Hotspot 虚拟机源码一、官网下载压…