Hudi Clustering

news2024/9/23 19:49:27

核心概念

Hudi Clustering对于在数据写入和读取提供一套相对完善的解决方案。它的核心思想就是: 在数据写入时,运行并发写入多个小文件,从而提升写入的性能;同时通过一个异步(也可以配置同步,但不推荐)进程或者周期性调度来执行小文件合并成大文件在这个过程中hudi还考虑到对数据按照特定的列进行重排序,这样在解决小文件问题的同时还优化了查询性能,可谓是“两全其美”。对于Clustering的手法其实是一种比较通用的优化数据重新布局的手段。其中在Hive/Spark SQL中都有类似的操作cluster by,只是在hudi中更加追求完美,多了一项合并小文件工作。关于cluster的几个配置参数:

配置项默认值说明
hoodie.clustering.inlinefalse
hoodie.clustering.schedule.inlinefalse
hoodie.clustering.async.enabledfalse
hoodie.clustering.inline.max.commits4
hoodie.clustering.async.max.commits4
hoodie.clustering.plan.strategy.small.file.limit314572800 ( 300MB )只有小于该值的文件才会被视为小文件,从而参与到 Clustering 中。
hoodie.clustering.plan.strategy.target.file.max.bytes1073741824 ( 1GB )限制 Clustering 生成的文件大小,默认是 1GB。合并后的最大文件不会超过该值。
hoodie.clustering.plan.strategy.sort.columns--针对哪个列重新进行排序。对于该字段过滤条件的查询有很大性能提高。

计划与执行

Clustering 的执行机制和compaction的机制类似,都是分为Schedule和execute两个阶段。计划的阶段主要是规划哪些文件参与Clusetring,然后生成一个计划Clusetring Plan保存到Timeline,Timeline中的Instant会有一个replacecommit的值,状态是REQUESTED ;执行阶段主要工作是读取Timeline中的计划,执行完毕,最后将replace commit改为COMPLETED状态。

同步与异步

和compaction一样。Clustering运行模式分为:同步、异步、半异步(为本文的一种叫法,在hudi官网没有体现。)他们之前的差异主要体现在从提交到计划到执行的的三个阶段的推进上。

同步模式(Inline schedule, Inline execute)

同步模式可概括为:立即计划,立即执行(Inline Schedule,Inline Execute)。在该模式下,当累积的提交(Commit)次数到达一个阈值时,会立即触发 Clustering 的计划与执行(计划和执行是连在一起的),而这个阈值是由配置项 hoodie.clustering.inline.max.commits 控制的,默认值是 4,即:默认情况下,每提交 4 次就(有可能)会触发并执行一次 Clustering。锁定同步模式的配置是:

配置项参数
hoodie.clustering.inlinetrue
hoodie.clustering.schedule.inlinefalse
hoodie.clustering.async.enabledFalse

异步模式(offline)

异步模式可概括为:另行计划,另行执行(Offline Schedule,Offline Execute)。在该模式下,任何提交都不会直接触发和执行 Clustering,除非使用支持异步 Clustering 的 Writer,否则用户需要自己保证有一个独立的进程或线程负责定期执行 Clustering 操作。在异步模式下,由于发起计划和提交之间没有必然的协同关系,所以在发起计划时,Timeline 中可能尚未积累到足够数量的提交,或者提交数量已经超过了规定阈值,如果是前者,不会产生计划计划,如果是后者,计划计划会将所有累积的提交涵盖进来,在这一点上,Clustering 和 Compaction 的处理方式是一致的。锁定异步模式的配置是:

配置项设定值
hoodie.clustering.inlinefalse
hoodie.clustering.schedule.inlinefalse
hoodie.clustering.async.enabledtrue

半异步(Inline Schedule,Offline Execute)

半异步模式可概括为:立即计划,另行执行(Inline Schedule,Offline Execute),即:计划会伴随提交自动触发,但执行还是通过前面介绍的三种异步方式之一去完成。简单总结一下半异步的设计思想:它在每次提交时都会尝试生成计划,如果此前已经生成了计划且尚未执行,则放弃计划,等待其被执行,当异步进程或线程完成执行作业时,紧接着的下一次提交会立即生成新的计划,这样,整个 Clustering 的“节奏”就由异步的执行程序来掌控了。锁定半异步模式的配置是:

配置项设定值
hoodie.clustering.inlineFalse
hoodie.clustering.schedule.inlinetrue
hoodie.clustering.async.enabledfalse

计划策略

Clustering 在排期和执行上都有可插拔的策略,以及在执行期间如何应对数据更新也有相应的更新策略,执行策略和更新策略较为简单,使用默认配置即可,本文不再赘述,详情可参考官方文档。本文着重介绍一下排期策略。Hudi 有三种 Clustering 排期策略可供选择:

  • SparkSizeBasedClusteringPlanStrategy:该策略为默认的排期策略,它会筛选出符合条件的小文件(就是看文件大小,小于 clustering.plan.strategy.small.file.limit 规定值的文件就是小文件),然后将选出的小文件分成多个 Group,Group 的数量和大小都是可配置的,划分 Group 的目的是提升 Clustering 的并行度。注意:该策略将会扫描全部分区。

  • SparkRecentDaysClusteringPlanStrategy:该策略会在此前 N 天的分区内查找小文件,对于使用日期作分区,且数据增量是可预期的数据表来说,这种策略是非常适合的。如果在这种情况下使用默认排期策略,就会扫描全部分区,给系统带来没有必要的负载。

  • SparkSelectedPartitionsClusteringPlanStrategy:该策略允许我们针对特定的分区进行 Clustering,这可能会应用在运维或某些具有独特业务特征的数据表上。

排序列

hoodie.clustering.plan.strategy.sort.columns 用于指定在 Clustering 过程中针对哪个列重新进行排序,这也是前文重点解释的 Clustering 能提升数据读取性能的关键。该列的选择对提升查询效率非常重要,通常会选择查询频率最高的条件列。尽管该配置项支持多列,但如果配置了两个或更多列的话,对于那些排在第一列后面的列来说,以它们为条件的查询并不能从中获得太多收益,这和在 HBase 中拼接列值到 Rowkey 中以提升检索性能是一样的。不过,Hudi 提供了以 z-order 和 hilbert 为代表的空间填充曲线技术用于解决多列排序问题。

关闭小文件检查

关闭parquet小文件检查;将hoodie.parquet.small.file.limit置为0。这样做hudi将会把所有的文件认为是大文件。任何数据在写入的时候都不在发生copy-on-write的copy的操作。而是直接写入新的文件,这样减少了写入操作的负担。所以产生的小文件就是Clustering就要去解决的事情。

同步Clustering

参数配置

配置项默认值设定值
hoodie.clustering.inlinefalseTrue
hoodie.clustering.schedule.inlinefalsefalse
hoodie.clustering.async.enabledFalseFalse
hoodie.clustering.async.enabled42
hoodie.clustering.async.enabled314572800 ( 300MB )314572800 ( 300MB )
hoodie.clustering.async.enabled1073741824 ( 1GB )1073741824 ( 1GB )
hoodie.parquet.small.file.limit104857600 ( 100MB )0

建表语句

create table small_file_hudi_cow (
  id int,
  name string,
  age int,
  city STRING,
  date_str STRING
) using hudi
tblproperties (
  type = 'cow',
  primaryKey = 'id',
  preCombineField = 'id',
  'hoodie.clustering.inline' = true,
  'hoodie.clustering.schedule.inline' = false,
  'hoodie.clustering.async.enabled' = false,
  'hoodie.clustering.inline.max.commits' = 2,
  'hoodie.clustering.plan.strategy.small.file.limit' = 314572800,
  'hoodie.clustering.plan.strategy.target.file.max.bytes' = 1073741824,
  'hoodie.parquet.small.file.limit' = '0'
)
partitioned by (date_str);

执行计划

步骤操作文件系统导入或者更新操作
1insertbase fileINSERT INTO small_file_hudi_cow SELECT id, name, age, city, event_date FROM sample_data_partitioned where event_date='2023-11-02';
2updatebase fileINSERT INTO small_file_hudi_cow SELECT id, name, age, city, event_date FROM sample_data_partitioned where event_date='2023-11-02';
3updateclustering +base fileINSERT INTO small_file_hudi_cow SELECT id, name, age, city, event_date FROM sample_data_partitioned where event_date='2023-11-02';

第一步:insert

Hudi 将其写入到一个 Parquet 文件中,第一组 File Group 随之产生。其文件信息及时间线如下:

第二步:

由于全量更新第一次的所有数据文件,更新后添加对应的一组 file 信息。其文件信息及时间线如下:

第三步:

在做一次全量的数据更新,同时设置了clustering 模式的最大提交次数为2,所以此次提交触发clustering 机制。自动发起了名为 replacecommit 提交,然后预计合并后的数据进行更新的commit 信息。其文件信息及时间线如下:

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

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

相关文章

SQL注入绕过正则及无列名注入

渗透测试 一、select\b[\s\S]*\bfrom正则二、科学计数法绕过三、过滤information四、无列名注入1、利用 join-using 注列名。2、无列名查询 五、报错注入7大常用函数1.ST_LatFromGeoHash()(mysql>5.7.x)payload 2.ST_LongFromGeoHash(mysq…

3 - Electron app BrowserWindow对象-关于窗口

优雅的打开应用~ 当加载缓慢,打开应用的一瞬间会出现白屏,以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio(目前只支持Windows及Mac平台)搭配相应的SDK进行,现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例,进行开发环境的搭建。 下载…

C#文件操作(一)

一、前言 学习心得:C# 入门经典第8版书中的第20章《文件》 二、操作文件的相关类 在C#应用程序中Syste.IO名称空间包含用于在文件中读写数据的类。在此我列举一下File、Directory、Path、FileInfo、DirectoryInfo、FileSystemInfo、FileSystemWatcher。其中在Syste…

pnpm :无法加载文件 D:\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

目录 一、问题描述 二、原因分析 三、解决问题 一、问题描述 pnpm : 无法加载文件 D:\learningsoftware\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID1351 70 中的 a…

文件包含 [SWPUCTF 2021 新生赛]include

打开题目 要求我们传入一个file进去,那我们get传入 /?file1 得到源码,并且提示我们flag在flag,php下 在源代码中,我们看见了allow_url_include函数,我们知道这涉及到文件包含。 一般默认allow_url_fopen是on的,那在…

线性回归中的似然函数、最大似然估计、最小二乘法怎么来的(让你彻底懂原理)收官之篇

图1 图2 图3 图4 问1:为什么要引入似然函数? 在线性回归中引入似然函数是为了通过概率统计的方法对模型参数进行估计。简单来说,我们希望找到一组参数,使得我们观测到的数据在给定这组参数的情况下最有可能发生。 问:1&#xf…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。 即:数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合,实现对这些数据…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore,Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

信息收集 - 网站架构

网站架构组成 通常,一个典型的网站架构包括以下组件: 动态脚本语言:动态脚本语言用于处理网站的逻辑和动态内容生成。常见的动态脚本语言包括PHP、Python、Ruby和Node.js等。这些脚本语言可以根据用户请求生成动态的网页内容。 数据库:数据库用于存储网站的数据,包括用户…

网易面试:亿级用户,如何做微服务底层架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格,遇到很多很重要的面试题: 微服务改造,你是怎么做的&#xff1…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

路由表route

目录 Windows维护路由表,利用route命令,VPN完美异地组网什么是多网络环境这里我做个情景演示重置ipv4网络再次确认一下网络背景网关是什么多网络规划思路最后拓展内容实测一下网关切换选项网关的网关命令整理 Windows维护路由表,利用route命令…

补题与周总结:leetcode第 376 场周赛

文章目录 复盘与一周总结2967. 使数组成为等数数组的最小代价(中位数贪心 回文数判断)2968. 执行操作使频率分数最大(中位数贪心 前缀和 滑窗) 复盘与一周总结 wa穿了第3题,赛时其实想到了思路:中位数贪心…

中央空调冷却塔循环水全自动加药装置PH电导率设备工作原理动画

一:全自动加药装置【概述】 随着在给水、排水处理过程中,常常投加各类化学药剂作为阻垢、杀菌灭藻、混凝、絮凝用,以达到净化水的目的。这些药剂有固体颗粒、液体,在投加过程中必须溶解、稀释及按配比定量投加方能取得最佳效果&am…

GZ015 机器人系统集成应用技术样题6-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书(学生赛) 样题6 选手须知: 本任务书共 25页,如出现任务书缺页、字迹不清等问题,请及时向裁判示意,并进行任务书的更换。参赛队…

DC-8靶场

目录 DC-8靶场链接: 首先进行主机发现: sqlmap得到账号密码: 反弹shell: exim4提权: Flag: DC-8靶场链接: https://www.five86.com/downloads/DC-8.zip 下载后解压会有一个DC-8.ova文件…

西门子S71200系列PLC通过PROFINET连接多功能电表

西门子S71200连接多功能电表 1、需求描述: 通过西门子S7-1200系列PLC,连接多功能电表,通过Modbus协议读写电表的数据。 2、方案描述: 桥接器的网口连接西门子S7-1200系列PLC的网口,串口连接到电表的485通讯口&#x…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …

Mysql的逻辑架构

一、Server层组件 1、连接器 连接器的作用是建立连接&#xff0c;管理权限&#xff0c;维持和管理连接 2、查询缓存 查询缓存的作用是以sql为key去查询缓存&#xff0c;如果缓存存在则直接返回结果 3、解析器 解析器的作用是对sql语句进行语法分析&#xff0c;和词法分析…