【Hudi】核心概念-基本概念

目录

  • 基本概念
    • 时间轴(TimeLine)
      • Instant action:在表上执行的操作类型
      • Instant time
      • State
      • 两个时间概念
    • 文件布局(File Layout)
    • 索引(Index)
      • 原理
      • 索引选项
        • 全局索引与非全局索引
        • 索引的选择策略
    • 表类型(Table Types)
    • 查询类型
      • Snapshot Queries
      • Incremental Queries
      • Read Optimized Queries
      • 不同表支持的查询类型

基本概念

时间轴(TimeLine)

在这里插入图片描述

Hudi的核心是维护表上在不同的即时时间(instants)执行的所有操作的时间轴(timeline),这有助于提供表的即时视图,同时还有效地支持按到达顺序检索数据。一个instant由一下三个部分组成:

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

  • commits:一次xommit表示将一批数据原子性地写入一个表
  • cleans:清除表中不在需要的旧版本文件的后台活动
  • delta_commit:增量提交指的是将一批数据原子性地写入一个MergeOnRead类型的表,其中部分或所有数据可以写入增量日志
  • compaction:合并Hudi内部差异数据结构的后台活动,例如:将更新操作从基于行的log日志文件合并到列式存储的数据文件。在内部,compaction体现为timeline上特殊提交。
  • rollback:表示当commit/delta_commit不成功时进行回滚,其会删除在写入过程中产生的部分文件。
  • savepoint:将某些文件组标记为已保存,以便其不会被删除。在发生灾难需要恢复数据的情况下,他有助于将数据集还原到时间轴上的某个点。

Instant time

通常是一个时间戳(例如20190117010349),他按照动作开始时间的顺序单调增加

State

  • requested:表示某个action已经调度,但尚未执行。
  • inflight:表示action当前正在执行
  • completed:表示timeline上的action已经完成

两个时间概念

区分两个重要的事件概念

  • Arrival time:数据到达Hudi的时间,commit time.
  • Event time:record中记录时间
    在这里插入图片描述

文件布局(File Layout)

Hudi将一个表映射为如下文件结构
在这里插入图片描述
Hudi存储分为两个部分:
(1)元数据:.hoodie目录对应着表元数据信息,包括表的版本管理(Timeline)、归档目录(存放过时的instant也就是版本),一个instant记录一次(commit)的行为、时间戳和状态,Hudi以时间轴的形式维护了在数据集上执行的所有操作的元数据;
(2)数据:和Hive一样,以分区方式存储数据;分区里面存放着Base File(.Parquet) 和Log File(.log.*);
在这里插入图片描述

  • Hudi将数据表组织成分布是文件系统基本路径(basepath)下的目录结构

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

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

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

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

  • Hudi采用了对版本并发控制
    1)compaction操作:合并日志和基本文件以产生新的文件片
    2)clean操作:清除不使用/旧的文件片以回收文件系统上的空间
    在这里插入图片描述

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

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

索引(Index)

原理

Hudi是通过索引机制提供高效的upserts,具体是指将给定的hoodie key(record key + partition path)与文件id(文件组)建立唯一映射。这种映射关系,数据第一次写入文件后保持不变,索引,一个FileGroup包含了一批record的所有版本记录。Index用于区分消息是INSERT 还是 UPDATE.
在这里插入图片描述

索引选项

名称备注
Bloom索引采用根据记录key构建的布隆过滤器,还可以选择使用记录key范围修剪候选文件。
GLOBAL_BLOOM索引与Boolm索引类似,但是作用范围是全局
Simple索引针对从存储上的表中提取的键对传入的更新/删除记录执行精益联接。
GLOBAL_SIMPLE索引与Simple类似,但是作用范围是全局
HBase索引将index信息保存到Hbase当中。
INMEMORY索引在Spark、Java程序、Flink的内存中保存索引信息,Flink和Java默认使用当前索引
BUCKET索引使用桶hash的方式定位文件组,在大数据量情况下效果较好。可以通过hoodie.index.bucket.engine指定bucket引擎。
RECORD_INDEX索引索引将record的key保存到 Hudi元数据表中的位置映射。
自定义索引自定义实现的索引。
全局索引与非全局索引
  • 全局索引:全局索引在全表的所有分区范围下强制要求键的唯一性.全局索引提供了更强的保证,但是随着表增大,update/delete操作损失的性能越高。因此,更适合于小表

  • 非全局索引:默认的索引实现,只能保证数据在分区的唯一性。非全局索引一开写入器为同一个记录的update/delete提供一致性的分区路径,同时大幅度提高了效率,更适用于大表

    从index的维护成本和写入性能的角度考虑,维护一个global index的难度更大 对写入性的影响也更大,所以需要non-global index.
    在这里插入图片描述

索引的选择策略
  • 对事实表的延迟更新
    大部分更新会发生在最新的几个分区上而小部分会在旧的分区;采用布隆索引
    Hudi缓存了输入记录并使用了自定义分区器和统计规律来解决数据倾斜。如果布隆过滤器的伪正率过高,查询会增加数据的打乱操作。Hudi支持动态布隆过滤器(设置hoodie.bloom.index.filter.type = DYNAMIC_V0),它可以根据文件里存放的记录数量来调整大小而达到设定的假阳性率。
  • 对事件表去重
    抵消耗去重是一个非常有挑战的工作。虽然可以用一个键值存储来实现去重(即Hbase索引),但索引存储的消耗会随着事件数增长而线性增长以至于变得不可行。事实上,有范围剪裁功能的布尔索引是最佳的解决方案
  • 对维度表的随机更删:使用简单索引更适合

表类型(Table Types)

  • Copy On Write(COW)
    在COW表中,**只有数据文件/基本文件(.parquet),没有增量日志文件(.log.*).**对每一个新批次写入都将创建相应数据文件的新版本(新的FileSlice),新版本文件包包括旧版本文件的记录以及来自传入批次的记录(全量最新)。
    由于再写入期间进行合并COW会产生一些写入延迟。但是COW的优势在于他的简单性,不需要其他表服务(如压缩),也相对容易调试。

  • Merge On Read(MOR)
    MOR表中,包含列存的进本文件(.parquet)和行存的增量日志文件(基于行的avro格式,.log.*)MOR表的合并成本在读取端在写入期间不会合并或创建较新的数据文件版本。标记/索引完成后,对于具有要更新记录的现有的数据文件。
    读取端将实时合并基本文件及各自的增量文件日志。每次的读取延迟比较高。所以Hudi使用压缩机制来将数据文件和日志合并在一起并创建更新版本的数据文件。

  • COW/MOR的对比
    在这里插入图片描述

查询类型

Snapshot Queries

快照查询,可以查询指定commit/delta commit即时操作后表的最新快照
在读取合并(MOR)表的情况下,它通过即时合并最先新文件片的基本文件和增量文件来提供近实时表(几分钟)。
对于写时复制(COW),它可以替代现有的parquet表(或相同基本文件类型的表),同时提供upsert/delete和其他写入方面的功能,可以理解为查询最新版本的parquet数据文件;
下图是COW的快照查询:
在这里插入图片描述

Incremental Queries

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

Read Optimized Queries

读优化查询,可查看给定的commit/compact即时操作的表的最新快照。仅将最新文件片的基本/列文件暴露查询,并保证非Hudi表相同的列查询性能。
下图是MOR表的快照查询与读优化查询的对比:
在这里插入图片描述
Read Optimized Queries是对Merge On Read 表类型快照查询的优化;
在这里插入图片描述

不同表支持的查询类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

出现“由于找不到msvcr120.dll,无法继继续执行代码”提示的问题处理方法

本文章针对出现“由于找不到msvcr120.dll,无法继续执行代码”的问题进行深入剖析,并提供了两种有效的解决方案,方便大家能快速恢复正常工作状态。 一.关于msvcr120.dll文件部分介绍 “由于找不到msvcr120.dll,无法继续执行代码”常发生在我们打开一个软…

web端使用高德地图

web端使用高德地图 一、申请高德key和秘钥二、在项目中引入所需功能js、css文件三、实现地图选点、回显选点四、自定义地图 一、申请高德key和秘钥 申请高德key 申请成功后可以得到key 二、在项目中引入所需功能js、css文件 <script src"https://webapi.amap.com/m…

流程设计的基本步骤

背景 公司为什么要流程&#xff0c;已经有专门章节进行阐述&#xff1b; 什么是流程&#xff0c;已经有专门章节进行专门阐述&#xff1b; 那么接下来这个章节讨论&#xff0c;流程设计的基本步骤&#xff0c;那么谁来设计流程呢&#xff0c;让一个部门的员工来设计一份流程…

【RabbitMQ】RabbitMQ配置与交换机学习

文章目录 简介安装和部署1. 安装RabbitMQ2.创建virtual-host3. 添加依赖4.修改配置文件 WorkQueues模型1.编写消息发送测试类2.编写消息接收&#xff08;监听&#xff09;类3. 实现能者多劳 交换机Fanout交换机1.消息发送2.消息监听 Direct交换机1.消息发送2.消息接收 Topic交换…

vue3 vant4 仿京东分类功能实现

Ⅰ- 壹 - 功能展示和使用需求 需求描述 基于vant 实现,仿京东分类功能实现样式交互等基本实现,细节可能需要优化 地址 https://gitee.com/wswhq/vue3-vant-temp/tree/master/src/view/ClassIfication 功能展示 Ⅱ - 贰 - 封装思路 不表述了自己看代码吧 Ⅲ - 叁 - 使用 …

梯度下降法、牛顿法、条件熵

梯度下降法、牛顿法&#xff08;可见南瓜书&#xff09; 梯度下降法 深度学习&#xff1a;梯度下降法数学表示式的详细推导 牛顿法 条件熵 在李航老师的书中&#xff0c;第六章最大熵模型这里有个条件熵的定义&#xff1a; 推导如下&#xff1a; 其他一些事实&#xff1a;…

Vue22-v-model收集表单数据

一、效果图 二、代码 2-1、HTML代码 2-2、vue代码 1、v-model单选框的收集信息 v-model&#xff1a;默认收集的就是元素中的value值。 单选框添加默认值&#xff1a; 2、v-model多选框的收集信息 ①、多个选择的多选 注意&#xff1a; 此处的hobby要是数组&#xff01;&…

springboot 整合redis问题,缓存击穿,穿透,雪崩,分布式锁

boot整合redis 压力测试出现失败 解决方案 排除lettuce 使用jedis <!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclus…

【电子信息工程专业课】学习记录

数字信号处理 离散时间信号与系统 周期延拓 一个连续时间信号经过理想采样后&#xff0c;其频谱将沿着频率轴以采样频率Ωs 2π / T 为间隔而重复。 混频 各周期的延拓分量产生频谱交替的现象 奈奎斯特采样定理 fs > 2fh Z变换 收敛域&#xff1a;使任意给定序列x(n)的Z变…

Sqoop学习详细介绍!!

一、Sqoop介绍 Sqoop是一款开源的工具&#xff0c;主要用于在Hadoop(HDFS/Hive/HBase)与传统的数据库(mysql、postgresql...)间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如 &#xff1a; MySQL ,Oracle ,Postgres等&#xff09;中的数据导进到Hadoop的H…

2024年金融、贸易与创意产业国际会议(ICFTCI 2024)

2024 International Conference on Financial Trade and Creative Industries 【1】大会信息 会议简称&#xff1a;ICFTCI 2024 大会地点&#xff1a;中国西安 投稿邮箱&#xff1a;icftcisub-paper.com 【2】会议简介 2024年金融贸易与创意产业国际会议即将召开&#xff…

【Python】已完美解决:executemany() takes exactly 2 positional arguments (3 given)

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中executemany()方法参数数量错误的问题 一、问题背景 在Python的数据库编程中&#xff0c;executemany()方法是一个常…

loading组件封装原理

以vue3为例&#xff0c;采用ts 的语言 首先可对所需数据定义在接口中 interface Prop{ //核心所需的就是 lading:boolean ,type: lading | skeleton} 进行调用 封装的话采用的是插槽 <div v-if"loading" ><slot name"template"><…

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…

私有云和多云管理平台 | Cloudpods v3.11.4 正式发布

本次 3.11.4 更新亮点为&#xff1a;系统镜像引入社区镜像&#xff0c;用户可以一键导入各主流开源操作系统镜像&#xff0c;方便用户上手使用。持续迭代共享 LVM&#xff0c;支持快照&#xff0c;主备机等特性&#xff0c;修复迁移删除镜像缓存等 BUG。 功能优化 【费用】费…

Vue25-内置指令02:v-text指令

一、v-html对比v-text v-html支持结构的解析&#xff0c;v-text不支持结构的解析。 二、v-html的安全性问题 2-1、cookie的原理&#xff08;node.js&#xff09; 7天免登录&#xff0c;cookie实现。 cookie的本质就是类似于json的字符串&#xff0c;格式是&#xff1a;key-va…

数据安全:Web3时代的隐私保护新标准

随着数字化时代的到来&#xff0c;我们的生活已经完全依赖于互联网和数据交换。然而&#xff0c;随之而来的是对个人隐私和数据安全的日益关注。在这个信息爆炸的时代&#xff0c;数据泄露、个人隐私侵犯和网络攻击等问题日益突出&#xff0c;而Web3技术的崛起正带来了一种全新…

【AI】文心一言的使用分享

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在改变我们的生活。文心一言&#xff0c;作为这一浪潮中的佼佼者&#xff0c;以其卓越的自然语言处理能力和广泛的应用场景&#xff0c;给我带来了前所未有的使用体验。在这篇分享中&#xff0c;我…

Sui Bridge在测试网上线并推出10万SUI激励计划

是一种为Sui设计的原生桥接协议&#xff0c;专门用于在Sui与其他网络之间桥接资产和数据。今天&#xff0c;Sui Bridge宣布在测试网上线。作为一种原生协议&#xff0c;Sui Bridge能够在Ethereum和Sui之间轻松且安全地转移ETH、wBTC、USDC和USDT&#xff0c;使其成为Sui基础设施…

基于 Python 解析 XML 文件并将数据存储到 MongoDB 数据库

1. 问题背景 在软件开发中&#xff0c;我们经常需要处理各种格式的数据。XML 是一种常用的数据交换格式&#xff0c;它可以存储和传输结构化数据。很多网站会提供 XML 格式的数据接口&#xff0c;以便其他系统可以方便地获取数据。 我们有这样一个需求&#xff1a;我们需要从…