【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.mzph.cn/web/26634.shtml

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

相关文章

集合并集交集差集【工具类】

一、使用Stream流进行处理 在Java开发中,对于集合的操作是非常常见的,特别是交集、并集和差集这样的操作。这些操作可以通过Java 8中的Stream API来实现。 •交集:取两个集合中相同的部分。例如,如果我们有两个List集合&#xff…

【2024最新精简版】Redis面试篇

文章目录 什么是红锁Redis有哪些框架?你们项目中哪里用到了Redis ?Redis的常用数据类型有哪些 ?Redis的数据持久化策略有哪些 ?Redis的数据过期策略有哪些 ?Redis的数据淘汰策略有哪些 ?你们使用Redis是单点还是集群 ? 哪种集群 ?Redis集群有哪些方案, 知道嘛…

iOS--oc对象,类,和元类本质

iOS--oc对象,类,和元类本质 前言实例对象的具体结构自定义类对象的结构继承关系 类信息的存放对isa、superclass总结 前言 最近在学习runtime的过程中,发现其中消息发送-动态方法解析-消息转发中涉及到了大量的类与对象的底层知识&#xff0…

在linux系统上挂载新硬盘

服务器的硬盘空间不够了,自己重新安装了一个硬盘,需要挂载,因为只是用来存放数据,所以不需要分区,直接挂载就可以 #查看当前所有硬盘 sudo fdisk -l #用于显示文件系统的磁盘空间使用情况 df -h发现一个/dev/nvme0n1 …

mysql索引失效的几种情况

1、对列进行计算或者是使用函数,则该列的索引会失效 如:substring(字段名,1,2)‘xxx’; 如:select * from test where id-19;//错误的写法; select * from test where id10; //正确的写法 ; 2、某些情况下…

java.nio.charset.UnmappableCharacterException

问题 java.lang.IllegalArgumentException: java.nio.charset.UnmappableCharacterException: Input length 1 解释为编码转换有问题 问题错在位置 非汉字存在 打包的时候就会报异常

TikTok限流封号要如何处理

随着TikTok在全球范围内的运营和管理越来越规范,对于违规行为的处罚也日趋严格。其中,限流和封号是两种常见的处罚措施。那么,当TikTok账号遭遇限流或封号时,我们应该如何处理呢? 一、了解限流和封号的原因 在处理Ti…

Zoom会议网络连接不稳定怎么办?

随着远程办公和在线会议的普及,Zoom已成为许多企业的重要办公工具。然而,国内企业在使用Zoom进行线上会议时,常常面临网络不稳定和中断的问题,这不仅影响会议效率,还可能给企业带来损失。那么,Zoom会议网络…

meilisearch的分页

Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。 所以,对于中小型项目来说…

APP分发平台在推广过程起到什么作用?

APP分发平台在推广过程中起到了至关重要的作用,这些作用主要体现在以下几个方面: 扩大应用覆盖面和市场份额:APP分发平台作为连接开发者和用户的桥梁,通过不同的分发渠道(如应用商店、第三方分发平台等)&a…

人生感悟 | 我们为什么贫穷?

哈喽,你好啊,我是雷工! 我们为什么贫穷? 因为我们都在局中并坦然的按着规则制定者循规蹈矩的生活。 01 负债导致贫穷 最近同事买房,总价一百多万,月供四千多,讲话:已入坑&#xff0…

python如何终止程序运行

方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…

SSC30KD SigmaStar 摄像头主控芯片

SSC30KD SigmaStar 摄像头主控芯片

opencv_特征检测和描述

理解特征 寻找独特的特定模式或特定特征,可以轻松跟踪和比较。 拼图:在图像中搜索这些特征,找到它们,在其他图像中查找相同的特征并对齐它们。而已。 基本上,角被认为是图像中的好特征。 在本单元中,我…

【python】如何import 另一个路径下的py文件内容

目录结构: ├─common │ └─config.py └─own_module │ └─run.py问题描述: 如何在run.py 中调用 config.py 中的函数或类? 解决办法: import os import sys # 为了引用自定义模块,可临时将module的绝对路径…

Interview preparation--案例加密后数据的模糊查询

加密数据的模糊查询实现方案 我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有&#xff1…

Python学习从0开始——Kaggle计算机视觉001

Python学习从0开始——Kaggle计算机视觉001 一、卷积分类器1.分类器2.训练分类器3.使用 二、卷积和RELU1.特征提取2.带卷积的过滤器定义3.激活:4.用ReLU检测5.使用 三、最大池化1.最大池压缩2.使用3.平移不变性 四、滑动窗口1.介绍2.步长3.边界4.使用 五、自定义Con…

Vue 简单自定义标签

Vue 简单自定义标签 思路&#xff1a; 1、计算每个项离父级左侧宽 left 2、计算当前滑块的宽&#xff0c;绝对定位 3、下一个项的宽/2-滑块的宽/2下一项离父级左侧的宽 left 4、使用定位left&#xff08;性能较差一点&#xff09; 或 translate 移动距离 <template><…

(几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。

(几何:六边形面积)编写程序&#xff0c;提示用户输入六边形的边长&#xff0c;然后显示它的面积。计 算六边形面积的公式是: 这里的s就是边长。下面是一个运行示例 package myjava; import java.math.*; import java.util.Scanner; public class cy {public static void main(S…

【MIT6.S081】准备工作

官方网站&#xff1a; 6.S081 / Fall 2020 相关资源&#xff1a; GitHub - PKUFlyingPig/MIT6.S081-2020fall: MIT undergraduate operating system course 版本控制 6.S081 All-In-One MIT6.S081 | Miigons blog