Hudi 系列-基础概念-索引机制

目录

  • 前言
  • 问题
  • 作用
    • 减少开销怎么理解
    • 数据变更基础
  • 类型
    • 全局索引
    • Flink
    • Spark
  • 总结

前言

Hudi 系列文章在这个这里查看 https://github.com/leosanqing/big-data-study

索引(Index)是 Hudi 最重要的特性之一,也是区别于之前传统数仓 Hive 的重要特点, 是实现 Time Travel, Update/Delete,事务 等重要特性的基础

Hudi provides efficient upserts, by mapping a given hoodie key (record key + partition path) consistently to a file id, via an indexing mechanism

Hudi 通过索引机制提供了高效的 upsert, 索引机制是通过映射 HoodieKey( recordKey+partition) 与 File Id 实现. 如果是非全局索引就不包括 partition

问题

  1. 什么是索引
  2. 索引作用
  3. 有哪些索引
  4. 全局索引与非全局索引区别
  5. Flink 支持哪些索引

作用

  1. 减小开销(也是实现数据更新的前提)
  2. Update/Delete 等数据变更的基础: Hudi的索引允许它知道在哪里可以找到给定的记录,因此在执行upsert或delete操作时,它可以直接访问和修改正确的数据文件,从而大大加速了这些操作。
  3. 事务支持:为了实现原子性的upsert和delete操作,Hudi维护了一个内部的事务日志。索引确保在操作期间正确、有效地识别和处理数据。
  4. 增量查询:除了提供对整个数据集的全量查询外,Hudi还支持增量查询,这使得用户只查看自上次查询以来对数据集所做的更改。索引在此功能中也起到关键作用,因为它帮助追踪哪些文件包含了新的或更改的记录。
  5. 时间旅行和数据快照:Hudi支持数据的多个版本,允许用户“回溯”到数据的早期状态。这对于数据审计、错误恢复或分析数据的历史变化非常有用。索引确保了数据版本之间的快速、高效的转换。
  6. 合并小文件(Clustering):在大数据生态系统中,小文件问题是一个众所周知的问题。Hudi利用其索引能力合并小文件以优化存储和查询性能。

减少开销怎么理解

with-and-without-index-81d481917e61e4cd1be2426c12994b8b.png

从上面官网的图可以看出来,没有索引和有索引的开销

如果没有索引, 因为我并不知道我要更新的数据在哪些文件中, 我每次的要实现更新需要访问所有的基础文件, 需要这么多 IO 的开销**(100+25) * 8 = 1200MB**

如果有索引, 我知道这些数据应该更新到哪些基础文件, 我只要找特定的文件就行, 所以开销为 (100+25*2) * 4 = 600MB

hive因为没有索引,所以他不支持变更操作(update/Delete),一次写入不能变更. 因为哪怕变更一条数据, 我都需要访问hdfs 上所有的文件(如果没有分区,有分区的话访问特定的分区下的所有文件),挨个比较主键, 然后重写之后上传到 hdfs

数据变更基础

因为我变更的时候知道了我这个数据应该去哪个文件找, 重写的成本就能接受了. 并且 Upsert 的时候我也能根据索引判断, 我这条写进来的数据应该是 Insert 还是应该 Update

以 COW 表,upsert 写入为例(当然上述步骤会根据索引类型和计算引擎有不同的实现和步骤,但是大体为上面的步骤)

数据进来 --> 计算主键 --> 根据主键查询索引判断是 Insert 还是 Update --> 根据 Insert 还是 Update 标记写入文件 – >写入时, 写到标记的文件,更新的更新,插入的插入–> 更新索引

类型

重要的索引类型具体会放在源码分析中详细分析,这里只简单讲个概念

  • BLOOM: 采用根据RecordKey构建的布隆过滤器,还可以选择使用RecordKey范围修剪候选文件。在分区内强制执行键唯一性。
  • GLOBAL_BLOOM: 采用根据RecordKey构建的布隆过滤器,还可以选择使用RecordKey范围修剪候选文件。表中的所有分区都强制执行键唯一性。
  • SIMPLE(Spark 引擎的默认值): Spark 引擎的默认索引类型。根据从存储上的表中提取的键对传入记录执行lean join。分区内强制执行键唯一性。
  • GLOBAL_SIMPLE: 根据从存储上的表中提取的键对传入记录执行lean join。表中的所有分区都强制执行键唯一性。
  • HBASE: 管理外部 Apache HBase 表中的索引映射,是全局索引。
  • INMEMORY(Flink 和 Java 的默认值): 使用 Spark 和 Java 引擎中的内存中 hashmap 以及 Flink 中的 Flink 内存中状态进行索引。
  • BUCKET:使用桶哈希来定位包含记录的文件组。尤其是在大规模的情况下是有利的。使用hoodie.index.bucket.engine选择bucket引擎类型,即如何生成bucket;
    • SIMPLE(默认):为每个分区的文件组使用固定数量的存储桶,无法缩小或扩展。这适用于 COW 和 MOR 表。由于存储桶的数量无法更改,并且存储桶和文件组之间采用一对一映射的设计,因此该索引可能不太适合高度倾斜的分区。
    • CONSISTENT_HASHING:支持动态数量的存储桶,并调整存储桶的大小以正确调整每个存储桶的大小。这解决了潜在的数据倾斜问题,即可以动态调整具有大量数据的分区的大小以具有合理大小的多个存储桶,这与 SIMPLE 存储桶引擎类型中每个分区的固定数量的存储桶不同。这仅适用于 MOR 表。
  • RECORD_INDEX: 将RecordKey保存到 HUDI 元数据表中的位置映射的索引。记录索引是全局索引,强制表中所有分区的键唯一性。支持分片以实现非常大的规模。
  • 自定义索引: 你可以扩展这个[publicAPI](https://github.com/apache/hudi/blob/master/hudi-client/hudi-client-common/src/main/java /org/apache/hudi/index/HoodieIndex.java) 来实现自定义索引。

全局索引

从上面类型看,有个GLOBAL 开头的就是全局索引,还包括 HBase 索引

全局索引的意思是, 一个recordKey, 不管你在不在同一个分区,有且只能有一个;非全局是只要我分区不相同,那我就是可以同时存在多个相同的 recordKey

比如 我是一个分区表, 我有两条数据 {id:1, county:China}, {id:1, country: Janpan},顺序写入. 分区为 country, recordKey 是id.

如果是全局索引,那我最后只会有一条数据 {id:1, country: Janpan}

如果是非全局索引,这两个数据都hui存在

Flink

Flink 只有三种索引: InMemory(FlinkState) 和 Bucket(SIMPLE, CONSISTENT_HASHING)

有时候我们看代码会感到疑惑,为啥源码里面,flink 列出了这么多索引,你却说只有三种,具体可以看这个 PR 中的 Comment https://github.com/apache/hudi/pull/6406

image-20231008192718710.png

虽然有个 类上面写了这么多,根本没有用, 最终只有 pipeline 初始化才有用.这里只有两种方式(官方说这个以后会报错,如果填写其他类型,flink 会报错)

真正的逻辑在这里 pipelines 类,所以看 flink web UI 的时候才会出现这样的情况:

桶索引没有 bucketAssigner,有 bucketWrite 算子

如果是 Flink State index 的任务 是 stream_write, 和 bucketAssigner算子

image-20231008192905638.png

Spark

spark 除了 InMemory 其他都支持

总结

  1. 什么是索引: 索引是通过HoodieKey(recordKey+partition) 与FileId 映射,从而加快查询/更新/删除等操作的一种机制
  2. 索引作用:
    1. 减小开销
    2. upsert/delete 的基础
    3. 加快其他特性. TimeTravel, 事务,Clustering,Compaction等的基础.如果没有索引,这些特性的开销是不可接受的
  3. 有哪些索引
    1. Bloom
    2. InMemory(Java, Flink State)
    3. Bucket
    4. Hbase
    5. Simple
    6. Record
  4. 全局索引与非全局索引区别: 全局索引 相同的RecordKey 全局仅会有一个,全局唯一;非全局索引,由于分区,可以存在多个 相同的RecordKey,全局不唯一
  5. Flink 支持哪些索引: 目前仅有三种: FlinkState, Bucket(Simple, consistent_hash)

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

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

相关文章

抢先知:公抓抓 信息挖掘工具

随着经济全球化进程的加速,企业在不断发展和壮大,同时也在不断地适应市场的变化。在这个过程中,企业信息的及时获取和掌握变得至关重要。那么,最新企业信息哪里找呢?在这里介绍几个路径,可以参考&#xff0…

ARM:使用汇编完成三个灯流水亮灭

1.汇编源代码 .text .global _start _start: 设置GPIOF寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<5)STR R1,[R0]设置GPIOE寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1ORR R1,R1,#(0x1<<4) 第4位设…

Visual Studio自定义模板参数、备注

模板路径&#xff1a; VS2022 x64&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplatesVS2022 x86&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplates 一、声明和启用模板…

4.方法操作实例变量 对象的行为

4.1 操作对象状态的方法 同一类型的每个对象能够有不同的方法行为&#xff0c;任一类的每个实例都带有相同的方法&#xff0c;但是方法可以根据实例变量的值来表现不同的行为。 play()会播放title值表示的歌曲&#xff0c;调用某个实例的play()可能会播放“Politik”而另一个会…

Zabbix自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

JMeter压测如何分配业务比例?

在进行综合场景压测时&#xff0c;由于不同的请求&#xff0c;要求所占比例不同&#xff0c;那如何实现呢&#xff1f; 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置&#xff0c;这种方法不是很好&#xff0c;想想&#xff0c;不…

百元开放式耳机哪款好一点耐用、百元耳放推荐

在耳机品类中&#xff0c;佩戴无需入耳、可保持耳道舒适的开放式耳机正成为新的潮流&#xff0c;不仅不少消费者趋之若鹜&#xff0c;相对于传统入耳式耳机&#xff0c;开放式耳机具备开放双耳的特性&#xff0c;能敞开耳道&#xff0c;让耳朵随时呼吸&#xff0c;保持干燥透气…

pytorch算力与有效性分析

pytorch Windows中安装深度学习环境参考文档机器环境说明3080机器 Windows11qt_env 满足遥感CS软件分割、目标检测、变化检测的需要gtrs 主要是为了满足遥感监测管理平台&#xff08;BS&#xff09;系统使用的&#xff0c;无深度学习环境内容swin_env 与 qt_env 基本一致od 用于…

MySQL查询(基础到高级)

一、单表查询&#xff1a; 1.基本查询&#xff1a; 1.1 查询多个字段&#xff1a; 1.查询所有字段&#xff1a; select * from 表名;2.查询指定字段&#xff1a; select 字段1,字段2 from 表名; 1.2 去除重复记录 select distinct "字段" FROM "表名"; …

Cuckoo沙箱各Ubuntu版本安装及使用

1.沙箱简介 1.1 沙箱 沙箱是一个虚拟系统程序&#xff0c;允许你在沙箱环境中运行浏览器或其他程序&#xff0c;因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境&#xff0c;在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中&#xff…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(七)放大镜实战

个人实战文档 本次实战是对自己整个api阶段的总结。 参考效果如下地址&#xff1a; http://erabbit.itheima.net/#/product/3995139 本次实战主要分为以下几个模块。 顶部导航模块 需求&#xff1a; 顶部导航开始不显示等页面滑到主导航栏&#xff0c;这个新顶部导航栏滑…

【C++设计模式之策略模式】分析及示例

描述 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时根据不同的情况选择算法的行为。该模式将算法的定义封装成一组易于切换和替换的类&#xff0c;使得算法可以独立于其使用者进行变化。 原理 策略模式通过将具体的算法…

WIN10 NPM的安装

引言&#xff1a; 什么是node.js? javaScript是一门脚本语言&#xff0c;通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行&#xff0c;HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

【Jmeter】性能测试脚本开发——性能测试环境准备、Jmeter脚本编写和执行

文章目录 一、常用的Jmeter元件二、性能测试环境准备三、编写Jmeter脚本四、执行测试脚本 一、常用的Jmeter元件 取样器-HTTP请求 作用&#xff1a;发送HTTP请求配置原件-HTTP请求默认值 作用&#xff1a;设置HTTP请求的默认参数配置原件-用户定义的变量 作用&#xff1a;定义…

84.柱状图中最大的矩形

class Solution { public:int largestRectangleArea(vector<int>& heights) {//法一&#xff1a;枚举宽&#xff0c;超时if(0){int nheights.size();int area0;for(int left0;left<n;left){int minHINT_MAX;for(int rightleft;right<n;right){minHmin(minH,hei…

ARM day5

三盏灯流水 .text .global _start _start: 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<4)STR R1,[R0] 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<5)STR R1,[R0] 2.LDR R0,0X50006000LDR R1,[R0]BIC R1,R1,#(0X3<<20)ORR R1,R1,#(0X1<<…

文件扫描模块

文章目录 前言文件扫描模块设计初级扫描方案一实现单线程扫描整合扫描步骤 设计初级扫描方案二周期性扫描 总结 前言 我们这个模块考虑的是数据库里面的内容从哪里获取。 获取完成后&#xff0c;这时候,我们就需要把目录里面文件/子文件都获取出来,并存入数据库。 文件扫描模…

强化学习------DQN算法

简介 DQN&#xff0c;即深度Q网络&#xff08;Deep Q-network&#xff09;&#xff0c;是指基于深度学习的Q-Learing算法。Q-Learing算法维护一个Q-table&#xff0c;使用表格存储每个状态s下采取动作a获得的奖励&#xff0c;即状态-价值函数Q(s,a)&#xff0c;这种算法存在很…

怎么用蜂邮EDM和Outlook批量发送邮件带附件

蜂邮EDM和Outlook批量发送邮件带附件的流程&#xff1f;有哪些邮件批量发送邮件附件的方法&#xff1f; 在现代社会中&#xff0c;电子邮件是一种广泛应用的沟通工具&#xff0c;而批量发送邮件带附件则是许多商业和个人用户的常见需求。本文将介绍如何使用蜂邮EDM和Outlook这…

高通camx开源部分简介

camera整体框架 ISP Pipeline diagram Simple Model Camx and chi_cdk 整体框架 CtsVerifier, Camra Formats Topology of Camera Formats. Topology (USECASE: UsecaseVideo) Nodes List Links between nodes Pipeline PreviewVideo Buffer manager Create Destro…