当前位置: 首页 > news >正文

探索Apache Hudi核心概念 (3) - Compaction

Compaction是MOR表的一项核心机制,Hudi利用Compaction将MOR表产生的Log File合并到新的Base File中。本文我们会通过Notebook介绍并演示Compaction的运行机制,帮助您理解其工作原理和相关配置。

1. 运行 Notebook

本文使用的Notebook是:《Apache Hudi Core Conceptions (4) - MOR: Compaction》,对应文件是:4-mor-compaction.ipynb,请先修改Notebook中的环境变量S3_BUCKET,将其设为您自己的S3桶,并确保用于数据准备的Notebook:《Apache Hudi Core Conceptions (1) - Data Preparation》已经至少执行过一次。Notebook使用的Hudi版本是0.12.1,Spark集群建议配置32 vCore / 128 GB及以上。

2. 核心概念

Compaction负责定期将一个File Slice里的Base File和从属于它的所有Log File一起合并写入到一个新的Base File中(产生新的File Slice),唯有如此,MOR表的日志文件才不至于无限膨胀下去。以下是与Compaction有关的几项重要配置,在后面的介绍中我们会逐一介绍它们的作用:

配置项默认值
hoodie.compact.inlinefalse
hoodie.compact.schedule.inlinefalse
hoodie.compact.inline.max.delta.commits5

2.1. 排期与执行

Compaction的运行机制包括:排期(Schedule)和执行(Execute)两个阶段。排期阶段的主要工作是划定哪些File Slices将参与Compaction,然后生成一个计划(Compaction Plan)保存到Timeline里,此时在Timeline里会出现一个名为compaction的Instant,状态是REQUESTED;执行阶段的主要工作是读取这个计划(Compaction Plan)并执行它,执行完毕后,Timeline中的compaction就会变成COMPLETED状态。

2.2. 同步与异步

从运行模式上看,Compaction又分同步、异步以及半异步三种模式(“半异步”模式是本文使用的一种叫法,为的是和同步、异步两种模式的称谓对齐,Hudi官方文档对这一模式有介绍,但没有给出命名),它们之间的差异主要体现在从(达到规定阈值的某次)提交(Commit)到排期(Schedule)再到执行(Execute)三个阶段的推进方式上。在Hudi的官方文档中,交替使用了Sync/Async和Inline/Offline两组词汇来描述推进方式,这两组词汇是有微妙差异的,为了表述严谨,我们使用同步/异步和立即/另行这两组中文术语与之对应。以下是Compaction三种运行模式的详细介绍:

  • 同步模式(Inline Schedule,Inline Execute)

请添加图片描述

同步模式可概括为:立即排期,立即执行(Inline Schedule,Inline Execute)。在该模式下,当累积的增量提交(deltacommit)次数到达一个阈值时,会立即触发Compaction的排期与执行(排期和执行是连在一起的),这个阈值是由配置项 hoodie.compact.inline.max.delta.commits 控制的,默认值是5,即:默认情况下,每5次增量提交就会触发并执行一次Compaction。锁定同步模式的配置是:

配置项设定值
hoodie.compact.inlinetrue
hoodie.compact.schedule.inlinefalse
  • 异步模式(Offline Schedule,Offline Execute)

请添加图片描述

异步模式可概括为:另行排期,另行执行(Offline Schedule,Offline Execute)。在该模式下,任何提交都不会直接触发和执行Compaction,除非使用了支持异步Compaction的Writer,否则用户需要自己保证有一个独立的进程或线程负责定期执行Compaction操作。Hudi提供了四种运行异步Compaction的方式:

  1. 通过hudi-cli或提交Spark作业驱动异步Compaction
  2. 提交Flink作业驱动异步Compaction
  3. 在HoodieDeltaStreamer中配置并运行异步Compaction
  4. 在Spark Structured Streaming中配置并运行异步Compaction

在后面的测试用例中,我们将使用第一种方式演示如何进行异步的Compaction排期与执行。和同步模式一样,在异步模式下,同样是当增量提交(deltacommit)次数达到一定的阈值时才会触发排期,这个阈值依然是hoodie.compact.inline.max.delta.commits

异步模式面临的场景要比同步模式复杂一些,同步模式下,每次提交时都会检查累积的提交次数是否已达规定阈值,所以在同步模式下,每次排期涵盖的增量提交数量基本是固定的,就是阈值设定的次数,但是在异步模式下,由于发起排期和增量提交之间没有必然的协同关系,所以在发起排期时,Timeline中可能尚未积累到足够数量的增量提交,或者增量提交数量已经超过了规定阈值,如果是前者,不会产生排期计划,如果是后者,排期计划会将所有累积的增量提交涵盖进来。锁定异步模式的配置是:

配置项设定值
hoodie.compact.inlinefalse
hoodie.compact.schedule.inlinefalse
  • 半异步模式(Inline Schedule,Offline Execute)

请添加图片描述

半异步模式可概括为:立即排期,另行执行(Inline Schedule,Offline Execute),即:排期会伴随增量提交(deltacommit)自动触发,但执行还是通过前面介绍的四种异步方式之一去完成。锁定半异步模式的配置是:

配置项设定值
hoodie.compact.inlinefalse
hoodie.compact.schedule.inlinetrue

3. 同步Compaction

3.1. 关键配置

《Apache Hudi Core Conceptions (4) - MOR: Compaction》的第1个测试用例演示了同步Compaction的运行机制。测试用的数据表有如下几项关键配置:

配置项默认值设定值
hoodie.compact.inlinefalsetrue
hoodie.compact.schedule.inlinefalsefalse
hoodie.compact.inline.max.delta.commits53
hoodie.copyonwrite.record.size.estimate1024175

这些配置项在介绍概念时都已提及,通过这个测试用例将会看到它们组合起来的整体效果。

3.2. 测试计划

该测试用例会先后插入或更新三批数据,然后进行同步的Compaction排期和执行,过程中将重点观察时间线和文件布局的变化,整体测试计划如下表所示:

步骤操作数据量(单分区)文件系统
1Insert96MB+1 Base File
2Update788KB+1 Log File
3Update1.2MB+1 Log File +1 Compacted Base File

提示:我们将使用色块标识当前批次的Instant和对应存储文件,每一种颜色代表一个独立的File Slice。

3.3. 第1批次

第1批次单分区写入96MB数据,Hudi将其写入到一个Parquet文件中,第一个File Group随之产生,它也是后续 Log File的Base File。需要注意的一个细节是:对于MOR表来说,只有进行Compaction的那次提交才会被称为“commit”,在Compaction之前的历次提交都被称作“deltacommit”,即使对于新建Base File写入数据的那次提交也是如此,就如同这里一样。

请添加图片描述

3.4. 第2批次

第2批次更新了一小部分数据,Hudi将更新数据写入到了Log文件中,大小788KB,fileVersion是1,它从属于上一步生成的Parquet文件,即Parquet文件是它的Base File ,这个Log文件的fileId和尾部的时间戳(baseCommitTime)与Parquet文件是一样的。当前的Parquet文件和Log文件组成了一个File Slice。

请添加图片描述

3.5. 第3批次

第3批次再次更新了一小部分数据,Hudi将更新数据又写入到一个Log文件中,大小1.2MB,fileVersion是2。与上一个Log文件一样,fileId和尾部的时间戳(baseCommitTime)与Parquet文件一致,所以它也是Parquet文件的Delta Log,且按Timeline排在上一个Log文件之后。当前的File Slice多了一个新的Log文件。但是,不同于第2批次,第3批次的故事到这里还没有结束,在该测试用例中,当前测试表的设置是:每三次deltacommit会触发一次Compaction,因此,第3次操作后就触发了第1次的Compaction操作:

请添加图片描述

于是,在Timeline上出现了一个commit(No.3),同时,在文件系统上,生成了一个新的96MB的Parquet文件,它是第一个Parquet文件连同它的两个Log文件重新压缩后得到的,这个新的Parquet文件fileId没变,但是instantTime变成了Compaction对应的commit时间,于是,在当前File Group里,第二个File Slice产生了,目前它还只有一个Base File,没有Log File。

请添加图片描述

3.6. 复盘

最后,让我们将此前的全部操作汇总在一起,重新看一下整体的时间线和最后的文件布局:

请添加图片描述

4. 异步Compaction

4.1. 关键配置

《Apache Hudi Core Conceptions (4) - MOR: Compaction》的第2个测试用例演示了异步Compaction的运行机制。测试用的数据表有如下几项关键配置:

配置项默认值设定值
hoodie.compact.inlinefalsefalse
hoodie.compact.schedule.inlinefalsefalse
hoodie.compact.inline.max.delta.commits53
hoodie.copyonwrite.record.size.estimate1024175

这些配置项在介绍概念时都已提及,通过这个测试用例将会看到它们组合起来的整体效果。

4.2. 测试计划

该测试用例会先后插入或更新三批数据,然后进行异步的Compaction排期和执行,过程中将重点观察时间线和文件布局的变化,整体测试计划如下表所示:

步骤操作数据量(单分区)文件系统
1Insert96MB+1 Base File
2Update788KB+1 Log File
3Update1.2MB+1 Log File
4Offline ScheduleN/AN/A
5Offline Execute96.15MB+1 Compacted Base File

由于该测试用例的前三步操作与第3节(第1个测试用例)完全一致,所以不再赘述,我们会从第4步操作(Notebook的3.8节)开始解读。

4.3. 异步排期

在完成了和第3节完全一样的前三批操作后,时间线和文件系统的情形如下:

请添加图片描述

这和3.5节执行后的状况非常不同,没有发生Compaction,连排期也没有看到,因为我们关闭了hoodie.compact.inline。于是,在接下来的第4步操作中(Notebook的3.8节),我们通过spark-submit手动发起了一个排期作业(--mode 'schedule'):

sudo -u hadoop spark-submit \--jars '/usr/lib/hudi/hudi-spark-bundle.jar' \--class 'org.apache.hudi.utilities.HoodieCompactor' \/usr/lib/hudi/hudi-utilities-bundle.jar \--spark-memory '4g' \--mode 'schedule' \--base-path "s3://${S3_BUCKET}/${TABLE_NAME}" \--table-name "$TABLE_NAME" \--hoodie-conf "hoodie.compact.inline.max.delta.commits=3"

执行后,文件布局没有变化,但是在时间线中出现了一个状态为REQUESTEDcompaction

请添加图片描述

4.4. 异步执行

第5步操作(Notebook的3.9节)通过spark-submit手动发起了一个执行作业(--mode 'execute'):

sudo -u hadoop spark-submit \--jars '/usr/lib/hudi/hudi-spark-bundle.jar' \--class "org.apache.hudi.utilities.HoodieCompactor" \/usr/lib/hudi/hudi-utilities-bundle.jar \--spark-memory '4g' \--mode 'execute' \--base-path "s3://${S3_BUCKET}/${TABLE_NAME}" \--table-name "$TABLE_NAME"

执行后,原compaction状态由REQUESTED变为COMPLETED,原Base File和两个Log File被合并打包成一个新的Base File文件,大小96MB:

请添加图片描述

4.5. 异步排期 + 异步执行

异步的排期和执行可以通过一个命令一步完成,《Apache Hudi Core Conceptions (4) - MOR: Compaction》的第3个测试用例演示了这一操作。它的前三步操作与第2个测试用例一样,在第四步时,使用了“Schedule + Execute”一起执行的方式(--mode 'scheduleAndExecute')一步完成了Compaction操作,命令如下:

sudo -u hadoop spark-submit \--jars '/usr/lib/hudi/hudi-spark-bundle.jar' \--class 'org.apache.hudi.utilities.HoodieCompactor' \/usr/lib/hudi/hudi-utilities-bundle.jar \--spark-memory '4g' \--mode 'scheduleAndExecute' \--base-path "s3://${S3_BUCKET}/${TABLE_NAME}" \--table-name "$TABLE_NAME" \--hoodie-conf "hoodie.compact.inline.max.delta.commits=3"

5. 半异步Compaction

5.1. 关键配置

《Apache Hudi Core Conceptions (4) - MOR: Compaction》的第4个测试用例演示了半异步Compaction的运行机制。测试用的数据表有如下几项关键配置:

配置项默认值设定值
hoodie.compact.inlinefalsefalse
hoodie.compact.schedule.inlinefalsetrue
hoodie.compact.inline.max.delta.commits53
hoodie.copyonwrite.record.size.estimate1024175

这些配置项在介绍概念时都已提及,通过这个测试用例将会看到它们组合起来的整体效果。

5.2. 测试计划

该测试用例会先后插入或更新三批数据,然后进行异步的Compaction Execute,过程中将重点观察时间线和文件布局的变化,整体测试计划如下表所示:

步骤操作数据量(单分区)文件系统
1Insert96MB+1 Base File
2Update788KB+1 Log File
3Update1.2MB+1 Log File
4Offline Execute96.15MB+1 Compacted Base File

由于该测试用例的前三步操作与第3节(第1个测试用例)完全一致,所以不再赘述,我们会从第3步操作(Notebook的5.7节)开始解读。

5.3. 同步排期

在完成了和第3节完全一样的前三批操作后,时间线和文件系统的情形如下:

请添加图片描述

在该模式下,第3次提交自动触发了Compaction排期,状态为REQUESTED

5.4. 异步执行

在接下来的第4步操作中,通过spark-submit手动发起了一个执行作业,排期计划被consume,原REQUESTED状态的Compaction变成了COMPLETED

请添加图片描述


关于作者:耿立超,架构师,著有 《大数据平台架构与原型实现:数据中台建设实战》一书,多年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验,个人技术博客:https://laurence.blog.csdn.net

相关文章:

探索Apache Hudi核心概念 (3) - Compaction

Compaction是MOR表的一项核心机制,Hudi利用Compaction将MOR表产生的Log File合并到新的Base File中。本文我们会通过Notebook介绍并演示Compaction的运行机制,帮助您理解其工作原理和相关配置。 1. 运行 Notebook 本文使用的Notebook是:《A…...

100Wqps异地多活,得物是怎么架构的?

说在前面 在40岁老架构师尼恩的数千读者群中,一直在指导大家简历和职业升级,前几天,指导了一个华为老伙伴的简历,小伙伴的优势在异地多活,但是在简历指导的过程中,尼恩发现: 异地多活的概念、异…...

35岁的测试工程师被公司强行辞退,感叹道:我以前就该好好努力了

曾经的高薪软件测试工程师,今年35岁了,被公司劝退了,外卖跑到凌晨,很累,但还是有一种想诉说的冲动。哪怕让大家觉得已经说得太多了,烦了,都成祥林嫂了,但是,我是真的想说…...

ASP.NET动态Web开发技术第5章

第5章数据验证一.预习笔记 1.验证控件概述: 2.RequiredFieldValidator(必填验证) 常用属性1:ControlToValidator:被验证的输入控件的ID 常用属性2:Text:验证失败时,验证控件显示的文本 常用…...

【数据结构与算法篇】时间复杂度与空间复杂度

目录 一、数据结构和算法 1.什么是数据结构? 2.什么是算法? 3.数据结构和算法的重要性 二、算法的时间复杂度和空间复杂度 1.算法效率 2.算法的复杂度 3.复杂度在校招中的考察 4.时间复杂度 5.空间复杂度 6.常见复杂度对比 7.复杂度的OJ练…...

HTTP API接口设计规范

1. 所有请求使用POST方法 使用post,相对于get的query string,可以支持复杂类型的请求参数。例如日常项目中碰到get请求参数为数组类型的情况。 便于对请求和响应统一做签名、加密、日志等处理 2. URL规则 URL中只能含有英文,使用英文单词或…...

数据一致性校验(pt-table-checksum)

介绍 pt-table-checksum 和 pt-table-sync 是 percona 公司发布的、检查 MySQL 主从数据库数据一致性校验的工具。pt-table-checksum 利用 MySQL 复制原理,在主库执行校验和计算,并对比主从库校验和,由此判断主从库数据是否一致。如果发现数…...

Talk预告 | 新加坡国立大学郑奘巍 AAAI‘23 杰出论文:大批量学习算法加速推荐系统训练

本期为TechBeat人工智能社区第486期线上Talk! 北京时间3月30日(周四)20:00,新加坡国立大学二年级博士生——郑奘巍的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “大批量学习算法加速推荐系统训练”,届时将分…...

肖 sir_就业课__004项目流程(H模型)

项目流程: 一、面试提问(h模型) 1、你说下你们公司测试流程? 2、给你一个需求你会怎么做? 3、你讲下你的工作? 4、谈谈你是如何去测试? 答案:h模型 要求第一人称来写 讲解简化文字流程&#x…...

snipaste 截图工具——可以使图片悬浮在任何软件上,方便对比

一、下载 官网下载地址:Snipaste Downloads (需要梯子) CSDN下载地址:https://download.csdn.net/download/weixin_43042683/87671809 1. 下载 压缩包后,免安装,直接解压后既可以使用。 2. 点击Snipaste.…...

Docker 快速部署Springboot项目

编写Dockerfile文件 # Docker image for springboot file run # VERSION 0.0.1 # Author: # 基础镜像使用java FROM openjdk:8 # 作者 MAINTAINER laihx # VOLUME 指定了临时文件目录为/tmp。 # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到…...

【LeetCode: 剑指 Offer II 112. 最长递增路径 | 递归 | DFS | 深度优先遍历 | 记忆化缓存表】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…...

hive 入门 一般用于正式环境 修改元数据(二)

安装配置可参考 https://blog.csdn.net/weixin_43205308/article/details/130020674 1、如果启动过derby,最小初始化过 在安装路径下删除 derby.log metastore_db rm -rf derby.log metastore_db此处省略安装mysql数据库 2、配置MySQL 登录mysql mysql -uroot …...

在RedHat系统上使用firewall-cmd命令可以将端口打开

在RedHat系统上使用firewall-cmd命令可以将端口打开,具体操作如下: 首先,检查当前系统使用的防火墙服务,比如firewalld或iptables,使用以下命令: systemctl status firewalld # 检查firewalld服务 system…...

分享(五):免费可用的多种类 API 大全集合整理

前言 搜罗了各大平台整理了一波免费可以用的 API ,有需要的收藏起来啦。 实名认证 运营商二要素 API :运营商校验此姓名、手机号码是否一致。 运营商三要素 API:运营商验证姓名、身份证号码、手机号码是否一致,返回验证结果称…...

8.1 假设验证的基本概念

学习目标: 要学习假设检验的基本概念,我会按照以下步骤进行: 了解假设检验的基本概念:假设检验是一种统计推断方法,用于判断某个假设是否成立。一般来说,假设检验包括原假设和备择假设两个假设&#xff0c…...

C语言基础

为了学习数据结构,整理一篇基础的C语言入门知识(仅供自身学习用) 条件运算符 语法:exp1 ? exp2 : exp3; exp1是条件表达式,如果结果为真,返回exp2 如果结果为假,返回exp3 if (a > b)max …...

Docker教程:如何将Helix QAC创建为一个容器并运行?

在这个Docker教程中,你将了解到如何将Helix QAC创建为一个容器化的镜像并运行。 Docker的基本定义是一个开源且流行的操作系统级虚拟化(通常称为“容器化”)技术,它是轻量级且可移植的,主要在Linux和Windows上运行。D…...

1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光,看起来MIT的课程的确是很有饱满度。 这里,再整理一份课程中的作业要求。 …...

记一次内存泄漏问题的排查

阶段一: 前段时间,突然发现服务在毫无征兆的情况下发生了重启。去看了一下容器退出的日志,发现内存利用率超过了100%,导致容器重启,进一步看了skyWalking,发现heap内存超了,当时只是简单的以为是…...

QML控件--Drawer

文章目录一、控件基本信息二、控件使用三、属性成员一、控件基本信息 Import Statement:import QtQuick.Controls 2.14 Since:Qt 5.7 Inherits:Popup 二、控件使用 Drawer:提供一个可以使用滑动手势打开和关闭的侧面板&#xff…...

PHY- PHY芯片概述

1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…...

【C++】如何获取当前正在运行的函数的名称?

func、FUNCTION、__PRETTY_FUNCTION__的区别 常用获取函数名成的方法都有__func__、FUNCTION、PRETTY_FUNCTION。那么它们的区别是什么呢?   1) func、FUNCTION: 主要是获取函数的名称。   2) PRETTY_FUNCTION: 不仅能获取函数的名称&am…...

42.原型对象 prototype

目录 1 面向对象与面向过程 2 原型对象 prototype 3 在内置对象中添加方法 4 constructor 属性 5 实例对象原型 __proto__ 6 原型继承 7 原型链与instanceof 7.1 原型链 7.2 instanceof 8 案例-模态框 1 面向对象与面向过程 编程思想有 面向过程 与 面向…...

python 读写txt方法

​​​​​​​ 1. Python支持在程序中读写 txt文件。这里有两种方式: 方式一:使用 python内置函数,该函数将一个字符串的长度转换为与这个字符串长度相关的值。 例如:" readme"("r)。 prin…...

香橙派pi5下,debian,docker19.03.9版本runc容器逃逸

在香橙派pi5下,debian,docker19.03.9版本下,安装系统后,启动docker,显示一切正常。 当加入k8s集群以后,可以正常连接到集群,node状态显示为ready。看起来一切正常。不过过一会之后,香橙派节点内存飙升,然后挂掉。重连失败,需要重启后才能重连。且swapoff -a命令执行…...

Thinkphp6.0中间件.上

本节课我们来学习一下中间件的用法,定义一下中间件。 一.定义中间件 1. 中间件的主要用于拦截和过滤 HTTP 请求,并进行相应处理; 2. 这些请求的功能可以是 URL 重定向、权限验证等等; 3. 为了进一步了解中间件的用法&…...

十进制到八进制的转换

目录 十进制到八进制的转换 程序设计 程序分析 十进制到八进制的转换 【问题描述】对于输入的任意一个非负十进制整数n(0=<n<100000),打印输出与其等值的八进制数 【输入形式】非负十进制整数 【输出形式】相应十进制整数转换后的八进制正整数,若输入不符合要求,…...

【从零开始学Skynet】基础篇(四):网络模块常用API

游戏服务端要处理客户端请求&#xff0c;作为服务端引擎&#xff0c;网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API&#xff0c;常用的API如下表所示&#xff1a;Lua API说明socket.listen(address ,port)监听一个端口&#xff0c;返回…...

怎么免费制作logo?logo免费设计在线生成,从此设计不求人

你有没有因为Logo制作而烦恼过&#xff1f;对于很多人来说&#xff0c;logo制作是一项比较大的工程&#xff0c;需要专门的设计师才能完成。但是请人设计费用高还很费时间&#xff0c;还需多次沟通修改。其实&#xff0c;我们可以自己免费制作logo&#xff0c;下面&#xff0c;…...