hudi系列-索引机制

news2024/11/18 18:39:07

1. 索引机制

hudi的索引机制是为了加速upsert/delete操作,它维护着(分区 + key)-> fileID之间的映射关系,所以可以减少对非必要base文件的合并

key是指索引key,可以是表的任意字段,在全局索引中常用主键key作为索引

在这里插入图片描述

1.1 索引类型

当前hudi支持以下类型的索引:

  • INMEMORY:基于内存hashmap,为全局索引
  • HBASE:基于外部存储hbase做索引,天然是全局索引
  • SIMPLE, GLOBAL_SIMPLE:简单索引,将更新的key与base文件提取的key值进行join,分为全局和非全局
  • BLOOM, GLOBAL_BLOOM:基于布隆过滤器,存在假阳性问题,分为全局和非全局
  • BUCKET:由字节跳动为了弥补bloom不足而贡献的分桶索引,非全局
  • FLINK_STATE:基于flink状态的全局索引

1.2 全局与非全局索引

  • 全局索引:必需存在表级别的唯一的索引key,每个索引key在所有分区中都只能唯一对应一条记录(一般可以采用hoodie record key,即主键)。update/delete时查找索引的复杂度是O(表记录数),所以适合小表场景。
  • 非全局索引:索引key在分区内唯一,对索引的查询只涉及本次update/delete记录的分区,所以它复杂度为O(更删记录数),适合数据量大的分区表。

2. 基于flink写的索引

虽然hudi的索引类型有这么多种,但是在使用flink往hudi写时只支持两种索引方式:BUCKET和FLINK_STATE

2.1 优化重构

在hudi的写过程中默认会调HoodieIndex#tagLocation来查找索引批量地给记录确定位置,逻辑位于BaseWriteHelper#write中,并且将查找索引花费的时间作为本次写的统计指标保存在HoodieWriteMetadata#indexLookupDuration中。

在流式引擎中,每一次都以批量的方式计算记录的位置会给系统造成很大压力,应该流式地去计算或者获取

基于flink的写过程FlinkWriteHelper重载去掉了查找索引的过程:

  1. 基于BUCKET的索引方式根本就不存在一份所谓的“索引数据”,它在写到文件中前根据哈希公式进行映射
  2. 基于FLINK状态的索引方式在BucketAssignFunction中流式地对每条记录进行了处理

2.1 索引对比

  • BUCKET:预先指定固定的分桶数(hoodie.bucket.index.num.buckets),所以记录可以按分桶字段(hoodie.bucket.index.hash.field)进行哈希计算得到所在分区的桶序号,每个桶代表一个数据文件。该索引方式的特点为,每个分区下的数据文件数固定,这样才保证可以固定(分区,索引key)->fileID之间的映射,不用花费额外的空间存储索引数据,我们需要预估每个分区的数据量以确定分桶数。
  • FLINK_STATE:以表的主键作为索引key,每个key的索引数据是一个ValueState,所以它天然是全局索引。是默认的索引方式,由于使用了flink的状态,所以使用时需要考虑状态过大给Job带来的问题,有一点需要注意的是,默认情况下状态并没有设置失效日期index.state.ttl

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

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

相关文章

Linux chmod命令详解,Linux修改文件权限

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 chmod 命令一、常用操作1. 字母形式2. 数字形式3. 递归设置二、文件权限解读三、数字权限四、特殊的root权限五、SUID详解1. 设置SUID2. 取消…

chatgpt小程序版本来了,解决你们手机上想用用不了的问题,chatgpt接口用到小程序里面,调用openai接口,提供前后端源码,可以私有部署使用

现在的chatgpt被玩的都开始加广告,又办会员什么的的,今天就把小程序的前后端无广告版本源码和部署方式说一下。 先看效果: 部署环境 前端用的uniapp,基础模版,单页面没有太多引用 后端使用的python的falsk框架&#…

javassist学习

Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深…

第29届中国国际广告节,酷开科技喜提三奖

第29届中国国际广告节,酷开科技喜提三奖 12月21日至12月23日,在风景如画的鹭岛厦门,第29届中国国际广告节于厦门国际会展中心隆重举行。经过几十年的高歌前行,中国国际广告节业已成为业界的盛会,更是中国广告业发展的…

(十)VUEElement

一、 VUE 1. 概述 Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。官网:https://cn.vuejs.org 2. 快速入门 &#…

CRM管理系统哪个好用?这五款CRM系统值得推荐

选择一款合适的CRM系统,可以有效解决企业生产经营中分散的数据、不规则的工作流程、缺乏客户服务、销售预测不准确、远程工作效率低、错误的客户沟通、几乎没有销售和市场合作、报告不足等方面的业务难题。 CRM系统的选型可以从以下方面考虑: 下面分享几…

Faster RCNN网络源码解读(Ⅺ) --- 预测结果后处理及预测过程(完结撒花)

目录 一、回顾以及本篇博客内容概述 二、代码解析 2.1 ROIHead类(承接上篇博客的2.1节) 2.1.1 初始化函数 __init__回顾 2.1.2 正向传播forward回顾及预测结果后处理 2.1.3 postprocess_detections 2.2 FasterRCNNBase类前向传播过程 2.3 Genera…

MySQL Workbench基本用法

MySQL Workbench相当于SQL语言的解释器 目录 1 打开 2 连接数据库 3 创建数据库 4 创建数据表 4.1 字段类型 4.2 字段选项 4.3 其他 5 操作表中的数据 5.1 添加 5.2 更改 5.3 删除 6 代码编辑器 7 保存sql代码 8 加载sql代码 1 打开 搜索MySQL …

滑动窗口题型

先看一个题目:题目描述 题目描述:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 例如: 输入:s "ADOBECODE…

移动Web【rem、flexible、Less、vw / vh】

文章目录remflexibleLessvw / vhrem 网页效果 屏幕宽度不同,网页元素尺寸不同(等比缩放) px单位或百分比布局可以实现吗? px单位是绝对单位百分比布局特点宽度自适应,高度固定 适配方案 remvw / vh rem单位 相对单位…

Homekit智能家居DIY之智能通断开关

智能通断器,也叫开关模块,可以非常方便地接入家中原有开关、插座、灯具、电器的线路中,通过手机App或者语音即可控制电路通断,轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及,越来越多的人想将自己的家改…

SQL SELECT DISTINCT 语句

SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …

如何从零开始开发一个小程序

如何从零开始开发一个小程序开始申请账号开发设置开发工具新建小程序阅读文档模版语法项目架构开始编写基础语法wx:for循环wx:if判断页面导航自定义组件引用样式修改单行、多行省略flex布局grid布局发布开始 申请账号 小程序注册页 开发设置 登录 小程序后台 ,…

【Vue2+Element ui通用后台】Mock.js

文章目录Mock.js首页数据调用mock数据并完成布局Mock.js Mock.js 官网 Mockjs Github地址 作用:生成随机数据,拦截 Ajax 请求 使用npm i mockjs进行安装,然后在 api 下新建 mock.js import Mock from mockjs// 定义mock请求拦截 Mock.mock…

【CPU是如何执行程序的?】

CPU是如何执行程序的?1、、硬件结构介绍1.1、CPU1.2、内存1.3、总线1.4、输入/输出设备二、程序执行的基本过程三、a11执行的详细过程现代计算机的基本结构为五个部分:CPU、内存、总线、输入/输出设备。或许你了解了这些概念,但是你知道a11在…

leetcode每日一题(python)2023-1.2 1801. 积压订单中的订单总数 (middle)

leetcode每日一题 🚩 学如逆水行舟,不进则退。 —— 《增广贤文》 题目描述: 给你一个二维整数数组 orders ,其中每个 orders[i] [price(i), amount(i), orderType(i)] 表示有 amount(i)( )笔类型为 orderType(i) 、价格为 pric…

没错,这是2023年开篇!!

不知不觉小G和Gopher们一起相伴着又走过了一个年头,迎来了2023年。回望这一年我们有遗憾:因疫情的原因没能和大家在线下2022 GopherChina大会相聚一堂我们也有快乐与成就:在经过一番调查、统计、分析后发布了《2022 Q2 GO开发者问卷调查结果》…

阿里、京东、百度“激战”互联网医疗

与衣食住行一样,医疗需求同样对人们的生存具有重要意义。医疗行业经过多年的发展,也已经发生了翻天覆地的变化。除了线下医疗日益完善之外,互联网医疗也随着互联网的飞速发展而实现了快速起飞。现如今,互联网医疗已经逐步成为了线…

沿全尺寸模型水平轴 MHK 涡轮机(DOE RM1)叶片性能表征计算(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 该存储库包括 MATLAB 脚本和输入文件示例,用于沿全尺寸模型水平轴 MHK 涡轮机叶片计算 3D AOA、CL 和 CD。该脚本是…

idea插件代码生成工具EasyCode

idea插件代码生成工具EasyCode1. EasyCode下载安装2. EasyCode配置模板2.1 配置路径2.2 配置文件2.2.1. controller.java2.2.2. entity.java2.2.3. mapper.java2.2.4. service.java2.2.5. serviceImpl.java2.2.6. mapper.xml3. 构建SpringBoot项目3.1 初始化数据库3.2 创建项目…