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

news2024/11/27 10:19:49

目录

  • 前言
  • 问题
  • 作用
    • 减少开销怎么理解
    • 数据变更基础
  • 类型
    • 全局索引
    • 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.coloradmin.cn/o/1070357.html

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

相关文章

手机切换ip地址的几种方法详解

在某些情况下,我们可能需要切换手机的IP地址来实现一些特定的需求,如解决某些应用程序的限制、绕过IP封禁等。本文将为大家分享几种切换手机IP地址的方法,让您能够轻松应对各种需求。 一、使用动态服务器 使用动态服务器是一种常见的切换手机…

一道经典的指针笔试题!!!!

文章目录 写在前面1. 笔试题代码2. 代码解释3. 代码执行运行结果总结 写在前面 本篇文章讲解了一道关于指针和数组的经典笔试题。 前两篇关于指针和数组的讲解,链接如下: 详解C语言指针(一) 详解C语言指针(二&#xf…

嵌入式养成计划-33--数据库

七十一、 数据库 71.1 数据库基本概念 数据(Data) 能够输入计算机并能被计算机程序识别和处理的信息集合数据库 (Database)数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合 常用的数据库 大型数…

定制自己的 Excel 界面 + 保存 Excel

文章目录 Excel 的界面自定义快速访问工具栏自定义功能区折叠或显示功能区自定义 Excel 的界面保存 Excel Excel 的界面 快速访问工具栏也可以放在功能区下方: 效果: 自定义快速访问工具栏 方法一: S1: S2: 方法二…

创作2周年?浅记一下~

前言: 最近确实有点缺乏去更新博客的动力,一晃两年过去了,其实也是我新入职公司的两年,两年虽然不长,但是确实发生了太多事情值得去记录下来... 机缘 说是机缘也不是算是,第一次写博客是刚好在CSDN里面查资…

JAVA BIO深入剖析

3.1 Java BIO 基本介绍 Java BIO 就是传统的 java io 编程,其相关的类和接口在 java.io BIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需 要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以…

单目标应用:猎豹优化算法(The Cheetah Optimizer,CO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、猎豹优化算法CO 猎豹优化算法(The Cheetah Optimizer,CO)由MohammadAminAkbari等人于2022年提出,该算法性…

微软有关AD域知识,创建AD域,新用户加入域步骤,MDE部署

一、有做过什么ad域的东西 AD是Active Directory的缩写,即Windows服务器的活动目录,在目录中可以收录公司的电脑账号,用户账号,组等等以提供更好的安全性和更便捷的管理能力。 域是组织单元,也是来划分安全界限的。当…

TCP/IP(二)导论

一 知识铺垫 以下内容参照 <<电子科技大学TCPIP协议原理>>全 ① 协议和标准 一组规则&#xff1a; 交通规则、学生上学的学生守则等;数据通信的规则,有一个专门的名称叫作协议 protocol语义&#xff1a;具体描述在通信当中,每一个信息的具体含义. 二进制bit流…

AI伦理:如何确保人工智能的公平与透明

文章目录 什么是AI伦理&#xff1f;AI公平性AI透明性 为什么AI公平性和透明性重要&#xff1f;确保AI公平性的方法1. 数据收集和准备2. 算法和模型3. 解释和可解释性4. 持续监测 确保AI透明性的方法1. 记录决策2. 可解释性工具3. 用户教育 AI伦理的挑战和未来结论 &#x1f389…

sed -i 使用变量进行替换

一、替换文本的命令 1、命令&#xff1a; sed -i s/old/new/g xxx.log 例子&#xff1a;将文件1.txt中的字符串 "cores":"" 替换成字符串 "cores":"1" 命令&#xff1a;sed -i s/"cores":""/"…

积分球可以用于什么光谱光学检测

积分球是光测量的主要工具之一。积分球可以同时捕获一个光源发出的所有辐射。 1.光源测量 积分球可以用于测量光源的光通量、色温、光效等参数。通过将光源放置在积分球的入口处&#xff0c;球内的光线经过多次反射后形成均匀的照度分布&#xff0c;然后使用光度计或光谱仪对光…

接口测试之Mock 测试

一、Mock 测试 1、Mock 测试的场景 前后端数据交互第三方系统数据交互硬件设备解耦 2、Mock 测试的价值与意义 不依赖第三方数据节省工作量节省联调 3、Mock 核心要素 匹配规则&#xff1a;mock的接口&#xff0c;改哪些接口&#xff0c;接口哪里的数据模拟响应 4、mock实…

四位十进制频率计VHDL,DE1开发板验证,仿真和源码

名称&#xff1a;四位十进制频率计VHDL&#xff0c;DE1开发板验证 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 数字频率计设计要求 1、四位十进制数字显示的数学式频率计,其频率测量范围为10~999%khz,测量单位为kHz。 2、要求量程能够转换。即测几十…

课题学习(五)----阅读论文《抗差自适应滤波的导向钻具动态姿态测量方法》

一、简介 抗差自适应滤波&#xff1a;利用等价权函数和自适应因子合理的分配信息&#xff0c;有效地滤除钻具振动对动态姿态测量的影响。、   针对导向钻井工具动态测量受钻具振动的影响而导致测量不准确的问题&#xff0c;提出一种抗差自适应滤波的动态空间姿态测量方法。通…

Kubernetes 加入主节点报错

现象 原因&#xff1a; 之前已经加入过一次 解决方案 [rootk8s-node01 k8s_images]# kubeadm reset [reset] WARNING: Changes made to this host by kubeadm init or kubeadm join will be reverted. [reset] Are you sure you want to proceed? [y/N]: y

基于Springboot实现校园新闻网站管理系统演示【项目源码+论文说明】

基于Springboot实现校园新闻网站管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个校园新闻网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校…

苹果ios打包签名ipa文件应用app的验证的证书是怎么授信的原理是什么?

苹果打包应用的证书依靠的是公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;PKI&#xff09;原理。 首先咱们要知道苹果的验证是基于PKI系统&#xff0c;PKI是一套基于非对称加密算法的加密体系&#xff0c;通过证书来验证和确保通信双方的身份和数据的完整性…

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

上篇文章介绍了一些常用的字符串函数&#xff0c;大家可以跳转过去浏览一下&#xff1a;c语言进阶部分详解&#xff08;详细解析字符串常用函数&#xff0c;并进行模拟实现&#xff08;上&#xff09;&#xff09;_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些&#x…

scala数组函数合集

目录 1. 添加类函数 2.生成类函数 3.删除类函数 4.查找类函数 5.统计类函数 6.修改类函数 7.判断类函数 8.获取集合元素 9.集合操作类函数 10.转换类函数 11.工具类函数 12.集合内与集合间计算函数 在 scala 中Array数组是一种可变的、可索引的数据集合 创建数组…