HUDI-0.11.0 BUCKET index on Flink 特性试用

server/2025/1/22 21:28:18/

1. 背景

在 0.10.1 版本下,使用默认的 index(FLINK_STATE),在 upsert 模式下,几十亿级别的数据更新会消耗大量内存,并且检查点(checkpoint)时间过长。因此,切换到 0.11.0 的 BUCKET 索引。

当前环境:Flink 1.13.2 + Hudi 0.11.0(master 2022.04.11) + COW + HDFS

关键配置项:

  • index.type = BUCKET
  • hoodie.bucket.index.num.buckets = 256

关键词

  • Hudi
  • COW
  • Flink
  • BUCKET
  • FLINK_STATE

2. BUCKET 与 FLINK_STATE 的区别

FLINK_STATE

  • 描述:Hudi 的 upsert 模式需要指定主键组,更新时按照主键进行更新。数据存储在 HDFS 文件上,因此需要维护主键与文件名的映射关系。Flink 的 state 用于存储这些映射关系。
  • 特点
    • 第一次加载 Hudi 表的历史数据时,需要设置 index.bootstrap.enabled = true 来加载历史数据到 state 中。
    • 支持跨分区更新。
  • 缺点
    • 占用大量内存。
    • 初始化加载历史数据较慢。

BUCKET

  • 描述:基于文件的分桶机制。例如,设置主键为 id,桶个数为 256,则计算桶序号的方法为 (id.hashCode() & Integer.MAX_VALUE) % 256
  • 特点
    • 桶的个数一旦设置,不能更改。
    • 文件个数固定,单个文件大小会随着数据量增加而增大。
    • 优点:不占用 Flink 的 Managed Memory
    • 缺点:文件 IO 操作会增加 CPU 压力。
    • 不支持跨分区更新
  • 建议
    • 预估数据量,设置合理的桶数量,避免小文件或写放大问题。
    • 可以通过离线导数据观察 HDFS 文件大小来预估桶数量。

总结

  • FLINK_STATE:占用内存,初始化加载历史数据慢,支持跨分区。
  • BUCKET:占用磁盘,不支持跨分区,节省内存。

3. 相关配置

Flink 实时流配置

'connector' = 'hudi',
'path' = 'hdfs://path/',
'index.type' = 'BUCKET',                 -- bucket索引
'hoodie.parquet.compression.codec'= 'snappy',
'table.type' = 'COPY_ON_WRITE',
'write.operation' = 'upsert', 
'write.task.max.size' = '2048', 
'write.precombine' = 'true',
'write.precombine.field' = 'update_time',
'write.tasks' = '6',
'write.bucket_assign.tasks' = '6',
'hoodie.bucket.index.hash.field' = 'id',         -- 主键
'hoodie.bucket.index.num.buckets' = '256',  -- 桶个数
'hive_sync.enable'='true',
'hive_sync.table'='TABLE_NAME',
'hive_sync.db'='DB_NAME',
'hive_sync.mode' = 'hms',
'hive_sync.metastore.uris' = 'thrift://HOST:9083',
'hive_sync.skip_ro_suffix' = 'true',
'write.insert.cluster' = 'true',
'write.ignore.failed' = 'true',
'clean.async.enabled' = 'true',
'clean.retain_commits' = '3', 
'hoodie.cleaner.commits.retained' = '3',
'hoodie.keep.min.commits' = '4', 
'hoodie.keep.max.commits' = '8'

Flink 离线导入数据配置

'connector' = 'hudi',
'path' = 'hdfs://PATH',
'hoodie.parquet.compression.codec'= 'snappy',
'index.type' = 'BUCKET',
'table.type' = 'COPY_ON_WRITE',
'write.operation' = 'bulk_insert', 
'write.tasks' = '2', 
'hoodie.bucket.index.num.buckets' = '256', 
'hoodie.bucket.index.hash.field' = 'id'

离线导入完成后

  • 观察 HDFS 文件,前八位为数字(例如 00000000-, 00000255-),即表示设置成功。
  • 然后可直接接入实时数据。

注意

  • 从 Hive 导数据到 Hudi 时,可以调整 Hive Source 的并行度:
    tableConfig.setInteger(HiveOptions.TABLE_EXEC_HIVE_INFER_SOURCE_PARALLELISM_MAX, source_parallelism_max)
    

4. 性能小结

实时情况

  • 基于当前数据量,单文件(80M)操作在 100ms 左右。例如:block read in memory in 171 ms. row count = 617384
  • 十几张表每次检查点(checkpoint)耗时约三四分钟,对于十几分钟的检查点间隔来说可以接受。

离线导数据情况

  • 对于亿级别数据的离线导入,资源消耗不大,十几分钟即可完成。

注意事项

  • 如果检查点设置过小,COW 表频繁操作 bucket 文件,会对集群 CPU 负载产生压力。

http://www.ppmy.cn/server/160567.html

相关文章

c++解决常见内存泄漏问题——智能指针的使用及其原理

目录 前言: 1. 智能指针的使用及其原理 1. 1 智能指针的使用场景分析 1.2 RAII和智能指针的设计思路 1.3 C标准库智能指针的使用 1.3 1 auto_ptr 1.3 2 unique_ptr 1.3 3 shared_ptr(重) 1.3 4 weak_ptr 1.3 5 模拟实现删除器 2.智能指针的原…

关于在vue3中vue3-tree-org的简单应用

效果图如下&#xff1a; 主要围绕&#xff1a;属性的使用方式、样式等问题来展示。 文档在这里&#xff1a;vue3-tree-org <vue3-tree-org :data"treeData" center :horizontal"false" :toolBar"toolBar" on-node-click"handleTreeNod…

vscode导入模块不显示类型注解

目录结构&#xff1a; utils.py&#xff1a; import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…

Visual Studio环境搭建Qgis二次开发环境

QGIS&#xff08;Quantum GIS&#xff09;是一款开源的地理信息系统软件&#xff0c;支持二次开发以满足特定的地理信息处理需求。二次开发通常涉及到使用QGIS提供的API和SDK来创建自定义插件或独立应用程序。以下是关于如何搭建QGIS二次开发环境的一些关键步骤和注意事项。 1…

Python 一步一步教你用pyglet制作汉诺塔游戏(续)

目录 汉诺塔游戏 7. 汉诺塔类 8. 移动圆盘 9. 移动演示 10. 递归问题 11. 任意展示 12. 鼠标操作 汉诺塔游戏 汉诺塔(Tower of Hanoi),是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候,他做了三根金刚石柱子,并在其中一根柱子上从下往上按…

基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&…

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、 regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff0…

redis 分布式方案

文章目录 前言一、主从复制1、主从配置2、建立连接3、数据同步3.1、全量同步3.2、全量同步配置3.3、 增量同步3.4、 增量同步配置 二、redis sentinel1、主要功能2、sentinel配置3、高可用3.1、故障发现3.2、故障转移3.2.1、选举sentinel进行故障转移3.2.2、选举从节点升级成主…