Hudi的核心概念 —— 索引(Index)

这篇具有很好参考价值的文章主要介绍了Hudi的核心概念 —— 索引(Index)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理

Hudi 通过索引机制提供高效的 upserts,具体是将给定的 hoodie key(record key(记录键) + partition path)与文件 id(文件组)建立唯一映射。这种映射关系,数据第一次写入文件后保持不变,

所以,一个 FileGroup 包含了一批 record 的所有版本记录。Index 用于区分消息是 INSERT 还是 UPDATE。

hudi 索引,Hudi,大数据

Hudi 为了消除不必要的读写,引入了索引的实现。在有了索引之后,更新的数据可以快速被定位到对应的 File Group。上图为例,白色是基本文件,黄色是更新数据,有了索引机制,可以做到:避免读取不需要的文件、避免更新不必要的文件、无需将更新数据与历史数据做分布式关联,只需要在 File Group 内做合并。

索引选项

索引选项 原理 优点 缺点
Bloom Index 默认配置,使用布隆过滤器 来判断记录存在与否,也可 选使用record key的范围裁剪 需要的文件 效率高,不依赖外部 系统,数据和索引保 持一致性 因假阳性问题,还 需回溯原文件再查 找一遍
Simple Index 把 update/delete 操作的新数 据和老数据进行 join 实现最简单,无需额 外的资源 性能比较差
HBase Index 把 index 存放在 HBase 里面。 在插入 File Group 定位阶段 所 有 task 向 HBase 发 送 Batch Get 请求,获取 Record Key 的 Mapping 信息 对于小批次的 keys, 查询效率高 需要外部的系统, 增加了运维压力
Flink State-based Index HUDI 在 0.8.0 版本中实现 的 Flink witer,采用了 Flink的 state 作为底层的 index 存储,每个 records 在写入之前都会先计算目标 bucket ID。 不 同 于 BloomFilter Index,避免了每次重复的文件 index 查找 Flink是基于状态计算,如果索引数据特别大,进一步影响Flink的CK,另一部分会影响Flink资源的使用,可以进行状态调优

注意:Flink 只有一种 state based index(和 bucket_index),其他 index 是 Spark 可选配置。

全局索引与非全局索引

全局索引:全局索引在全表的所有分区范围下强制要求键的唯一性,也就是确保对给定的键有且只有一个对应的记录。全局索引提供了更强的保证,但是随着表增大,update/delete 操作损失的性能越高,因此更适用于小表。

非全局索引:默认的索引实现,只能保证数据在分区的唯一性。非全局索引依靠写入器为同一个记录的 update/delete 提供一致的分区路径,同时大幅提高了效率,更适用于大表。从 index 的维护成本和写入性能的角度考虑,维护一个 global index 的难度更大,对写入性能的影响也更大,所以需要 non-global index。

HBase 索引本质上是一个全局索引,bloom 和 simple index 都有全局选项:

  • hoodie.index.type=GLOBAL_BLOOM
  • hoodie.index.type=GLOBAL_SIMPLE

索引的选择策略

1)对事实表的延迟更新
许多公司会在 NoSQL 数据存储中存放大量的交易数据。例如共享出行的行程表、股票买卖记录的表、和电商的订单表。这些表通常一直在增长,且大部分的更新随机发生在较新的记录上,而对旧记录有着长尾分布型的更新。这通常是源于交易关闭或者数据更正的延迟性。换句话说,大部分更新会发生在最新的几个分区上而小部分会在旧的分区。
对于这样的作业模式,布隆索引就能表现地很好,因为查询索引可以靠设置得当的布隆过滤器来裁剪很多数据文件。另外,如果生成的键可以以某种顺序排列,参与比较的文件数会进一步通过范围裁剪而减少。Hudi 用所有文件的键域来构造区间树,这样能来高效地依据输入的更删记录的键域来排除不匹配的文件。
为了高效地把记录键和布隆过滤器进行比对,即尽量减少过滤器的读取和均衡执行器间的工作量,Hudi 缓存了输入记录并使用了自定义分区器和统计规律来解决数据的偏斜。有时,如果布隆过滤器的假阳性率过高,查询会增加数据的打乱操作。Hudi 支持动态布隆过滤器(设置 hoodie.bloom.index.filter.type=DYNAMIC_V0)。它可以根据文件里存放的记录数量来调整大小从而达到设定的假阳性率。

2)对事件表的去重
事件流无处不在。从 Apache Kafka 或其他类似的消息总线发出的事件数通常是事实表大小的 10-100 倍。事件通常把时间(到达时间、处理时间)作为首类处理对象,比如物联网的事件流、点击流数据、广告曝光数等等。由于这些大部分都是仅追加的数据,插入和更新只存在于最新的几个分区中。由于重复事件可能发生在整个数据管道的任一节点,在存放到数据湖前去重是一个常见的需求。

总的来说,低消耗去重是一个非常有挑战的工作。虽然可以用一个键值存储来实现去重(即 HBase 索引),但索引存储的消耗会随着事件数增长而线性增长以至于变得不可行。事实上,有范围裁剪功能的布隆索引是最佳的解决方案。我们可以利用作为首类处理对象的时间来构造由事件时间戳和事件 id(event_ts+event_id)组成的键,这样插入的记录就有了单调增长的键。这会在最新的几个分区里大幅提高裁剪文件的效益。

3)对维度表的随机更删
正如之前提到的,如果范围比较不能裁剪许多文件的话,那么布隆索引并不能带来很好
的效益。在这样一个随机写入的作业场景下,更新操作通常会触及表里大多数文件从而导致布隆过滤器依据输入的更新对所有文件标明阳性。最终会导致,即使采用了范围比较,也还是检查了所有文件。使用简单索引对此场景更合适,因为它不采用提前的裁剪操作,而是直接和所有文件的所需字段连接。如果额外的运维成本可以接受的话,也可以采用 HBase 索引,其对这些表能提供更加优越的查询效率。
当使用全局索引时,也可以考虑通过设置 hoodie.bloom.index.update.partition.path=true 或
hoodie.simple.index.update.partition.path=true 来处理 的情况;例如对于以所在城市分区的用户表,会有用户迁至另一座城市的情况。这些表也非常适合采用 Merge-On-Read 表型。文章来源地址https://www.toymoban.com/news/detail-628848.html

到了这里,关于Hudi的核心概念 —— 索引(Index)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hudi的bucket.index相关配置

    hudi的bucket.index相关配置的源码文件为 HoodieIndexConfig.java 。 通用配置 配置项名 默认值 说明 引入版本 hoodie.index.type 默认值和引擎有关,Flink上默认值为FLINK_STATE,Spark上默认值为SIMPLE,Java应用的默认值为INMEMORY 索引类型,可取值:HBASE、INMEMORY、BLOOM、GLOBAL_BLOOM、SIMPLE、GLOBAL_

    2024年02月03日
    浏览(32)
  • 基于数据湖的多流拼接方案-HUDI概念篇

    目录 一、为什么需要HUDI? 1. 传统技术选型存在哪些问题? 2. Hudi有什么优点? 基于 Hudi Payload 机制的多流拼接方案: 二、HUDI的应用场景 1. 什么场景适合使用hudi? 2. 什么场景不适合使用hudi? 三、什么是HUDI?HUDI能做什么? 1. 什么是HUDI? 2. HUDI能做什么(特性)? 四、HU

    2024年02月11日
    浏览(42)
  • Hudi(19):Hudi集成Flink之索引和Catalog

    目录 0. 相关文章链接 1. Bucket索引(从 0.11 开始支持) 1.1. WITH参数 1.2. 和 state 索引的对比 2. Hudi Catalog(从 0.12.0 开始支持) 2.1. 概述 2.2. WITH 参数 2.3. 使用dfs方式  Hudi文章汇总          默认的 flink 流式写入使用 state 存储索引信息:primary key 到 fileId 的映射关系。当

    2024年02月05日
    浏览(39)
  • Hudi的7种索引

    Bloom Index (default) 使用根据记录键构建的bloom过滤器,也可以使用记录键范围修剪候选文件.原理为计算RecordKey的hash值然后将其存储到bitmap中,为避免hash冲突一般选择计算3次 HoodieKey 主键信息 :主要包含recordKey 和patitionPath 。recordkey 是由hoodie.datasource.write.recordkey.field 配置项根

    2024年02月14日
    浏览(35)
  • Apache hudi 核心功能点分析

    文中部分代码对应 0.14.0 版本 初始的需求是Uber公司会有很多记录级别的更新场景,Hudi 在Uber 内部主要的一个场景,就是乘客打车下单和司机接单的匹配,乘客和司机分别是两条数据流,通过 Hudi 的 Upsert 能力和增量读取功能,可以分钟级地将这两条数据流进行拼接,得到乘客

    2024年02月02日
    浏览(32)
  • Hudi系列15:Hudi元数据同步到Hive

    使用DataSource writer或HoodieDeltaStreamer写入数据支持将表的最新模式同步到Hive metastore,这样查询就可以获得新的列和分区。在这种情况下,最好从命令行或在一个独立的jvm中运行,Hudi提供了一个HiveSyncTool,一旦你构建了Hudi -hive模块,就可以如下所示调用它。以下是我们如何同步

    2024年02月02日
    浏览(44)
  • 数据湖架构Hudi(二)Hudi版本0.12源码编译、Hudi集成spark、使用IDEA与spark对hudi表增删改查

    Hadoop 3.1.3 Hive 3.1.2 Flink 1.13.6,scala-2.12 Spark 3.2.2,scala-2.12 2.1.1 环境准备 2.1.2 下载源码包 2.1.3 在pom文件中新增repository加速依赖下载 在pom文件中修改依赖的组件版本: 2.1.4 修改源码兼容hadoop3并添加kafka依赖 Hudi默认依赖的hadoop2,要兼容hadoop3,除了修改版本,还需要修改如下代

    2024年02月06日
    浏览(57)
  • 02_快速体验 Hudi、编译 Hudi、安装HDFS、安装Spark 3.x、模拟数据、插入数据、查询数据、.hoodie文件、数据文件、Hudi 数据存储概述、Metadata 元数据等

    本文来自\\\"黑马程序员\\\"hudi课程 2.第二章 快速体验 Hudi 2.1 编译 Hudi 2.1.1 第一步、Maven 安装 2.1.2 第二步、下载源码包 2.1.3 第三步、添加Maven镜像 2.1.4 第四步、执行编译命令 2.1.5 第五步、Hudi CLI测试 2.2 环境准备 2.2.1 安装HDFS 2.2.2 安装Spark 3.x 2.3 spark-shell 使用 2.3.1 启动spark-shell

    2024年02月04日
    浏览(39)
  • 04_Hudi 集成 Spark、保存数据至Hudi、集成Hive查询、MergeInto 语句

    本文来自\\\"黑马程序员\\\"hudi课程 4.第四章 Hudi 集成 Spark 4.1 环境准备 4.1.1 安装MySQL 5.7.31 4.1.2 安装Hive 2.1 4.1.3 安装Zookeeper 3.4.6 4.1.4 安装Kafka 2.4.1 4.2 滴滴运营分析 4.2.1 需求说明 4.2.2 环境准备 4.2.2.1 工具类SparkUtils 4.2.2.2 日期转换星期 4.2.3 数据ETL保存 4.2.3.1 开发步骤 4.2.3.2 加载CS

    2024年02月13日
    浏览(48)
  • 大数据技术之Hudi

    1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同时保持数据的开源文件格式。 Apache Hudi不仅非常适

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包