Hudi 文件布局(File Layouts)

news2024/11/25 4:39:17

文章目录

  • Hudi File Layouts
    • 1 核心概念
      • 1.1 Base File
      • 1.2 Base File
      • 1.3 File Slice
      • 1.4 File Group
    • 2. File Layouts写过程
      • 2.1 COW表
      • 2.2 MOR表

Hudi File Layouts

1 核心概念

  • File Layouts(文件布局)是指Hudi的数据文件在存储介质上的分布,Hudi会严格管理数据文件的命名、大小和存放位置,并会在适当时机新建、合并或分裂数据文件,这些逻辑都会体现在文件布局上。
  • Hudi在文件操作上有一个重要,文件一旦创建,永远不会再更新,任何添加、修改或删除操作只会在现有文件数据的基础上合并输入数据一起写入到下一个新文件中,清楚这一点对我们解读文件布局很有帮助。
  • 整体上,Hudi文件布局的顶层结构是数据表对应的base目录,下一层是各分区目录,分区目录可根据分区列数量嵌套多层,这和Hive/Spark的表结构是一致的。在最底层分区文件夹上,Hudi不再创建子文件夹,全部都是平铺的数据文件,但是这些文件在逻辑上依然有着清晰的层级关系。顶层的文件集合是File Group,File Group下面是File Slice,File Slice下面就是具体的数据文件了。我们反过来,按从下到上的顺序梳理一下这些文件和文件集合

1.1 Base File

Base File是存储Hudi数据集的主体文件,以Parquet等列式格式存储,所以我们在Hudi中看到的Parquet文件基本都是Base File。实际上,Base File的命名是为了呼应Log File,在没有Log File的COW表里,Base File就是基层的数据存储文件,没必要强调它的“Base”身份,直接叫Parquet文件就可以。Base File遵循一致的命名规范,格式为:

<fileId>_<writeToken>_<instantTime>.parquet

在这里插入图片描述

fileId部分是一个uuid,我们会在多个文件中看到相同的fileId,这些fileId相同的文件就组成了一个File Group。instantTime是写入这个文件对应的instant的时间,也是该文件的一个“版本”标注,因为一个Base File历经多轮增删改操作后就会产生多个版本,Hudi就使用instantTime对它们进行标识。不管是MOR表还是COW表,都有Base File,只是在COW表里只有Base File,在MOR表里除了Base File还有Log File。

1.2 Base File

Log File是在MOR表中用于存储变化数据的文件,也常被称作Delta Log,Log File不会独立存在,一定会从属于某个Parquet格式的Base File,一个Base File和它从属的若干Log File所构成的就是一个File Slice。Log File也遵循一致的命名规范,格式为:

.<fileId>_<baseCommitTime>.log.<fileVersion>_<writeToken>

在这里插入图片描述
不同于Base File,Log File文件名中时间戳部分并不是Log File自己对应的instanceTime,而是它所从属的Base File的instanceTime,即baseCommitTime。如此一来,就没有办法通过时间戳来区分Log File提交的先后顺序了,所以Hudi在Log File文件名中加入了fileVersion,它是一个从1开始单调递增的序列号,用于标识Log File产生的顺序。

1.3 File Slice

在MOR表里,由一个Base File和若干从属于它的Log File组成的文件集合被称为一个File Slice。应该说File Slice是针对MOR表的特定概念,对于COW表来说,由于它不生成Log File,所以File Silce只包含Base File,或者说每一个Base File就是一个独立的File Silce。总之,对于COW表来说没有必要区分File Silce,也不没必要强调Base File的“Base”身份,只是为了概念对齐,大家会统一约定Hudi文件的三层逻辑布局为:File Group -> File Slice -> Base / Log Files。

1.4 File Group

在前面介绍Base File时,我们已经提到了File Group,简单说,就是fileId相同的文件属于同一个File Group。同一File Group下往往有多个不同版本(instantTime)的Base File(针对COW表)或Base File + Log File的组合(针对MOR表),当File Group内最新的Base File迭代到足够大( >100MB)时,Hudi就不会在当前File Group上继续追加数据了,而是去创建新的File Group。

2. File Layouts写过程

2.1 COW表

在这里插入图片描述
图中:青色、紫色和红色标注的文件分属于三个File Group,因为它们开头的uuid是三个不同的值,从文件名尾部的instantTime可以推断它们被创建的先后时间。当前的文件布局是历经4次操作演进而来,以分区parity=0为例,时间线(Timeline)如下:

  1. 第1次插入96M数据,生成了第一个Parquet文件;
  2. 第2次插入14M数据,在Copy On Write机制运作下,插入的14M数据与原96M数据合并写入新的Parquet文件,大小110M,fileID不变;
  3. 第3次插入3.7M数据,由于现有Parquet文件已经超过了100M的阈值,被Hudi判定为大文件,故不再选择它进行Copy On Write操作,转而生成新的fileId,创建新的File Group,并将数据写入新File Group的Parquet文件中,大小3.7M;
  4. 第4次插入182M数据,现有3.7M的文件是一个小文件,Hudi会选择以该文件为基础,将其3.7M的数据和新插入数据一起合并写入新的Parquet文件,由于这次插入的数据量较大,写入文件的体积将会超过Hudi规定的单一Parquet文件的上限(120M),所以Hudi将182M中的116M与现有3.7M数据合并,写满一个Parquet文件(120M),同时创建第3个File Group,将另外66M数据写入第3个File Group下的Parquet文件中。注意:66M的文件使用红色标记,属于一个独立的File Group,但它却是第④次提交的产物,不存在第5次提交。

2.2 MOR表

在这里插入图片描述
图中:单一分区下的所有文件属于一个File Group(uuid全部相同),黄色和蓝色标注的文件分属于两个不同的File Slice,其中两个Parquet文件是两个File Slice各自的Base File,它们各带两个Log File。当前的文件布局是历经4次操作(5次提交)演进而来,以分区parity=0为例,

  1. 第1次插入96M数据,生成了第一个Base File;
  2. 第2次更新了其中的一小部分数据,生成了从属于第一个Base File文件的第一个Log File,大小804K,fileVersion是1;
  3. 第3次又更新了其中的一小部分数据,生成了从属于第一个Base File文件的第二个Log File,大小1.2M,fileVersion是2;
  4. 由于该表启用了同步压缩(Inline Compaction),并将触发Compaction的deltacommits阈值设为了3,所以第3次提交后触发了同步的Compaction操作,Hudi将此前的Base File和两个Log File压缩成一个新的Base File,大小96M,fileId不变,这样就出现了第二个File Slice。每次Compaction都会进行一次独立的提交(即commit,非deltacommit),所以新Base File尾部的时间戳更新为Compaction这次提交对应的instantTime;
  5. 第4次更新(但却已是第5次提交)的数据量达到了307M,由于该测试表的Log File上限被设定为了250M,此次提交触发了Log File的分裂,Hudi将更新数据写入了两个Log File,一个268M,fileVersion是1;另一个39M,fileVersion是2

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

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

相关文章

剑指 Offer ! ! 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 思路&…

Spring Boot 中的 @MessageMapping 注解:原理、用法与示例

Spring Boot 中的 MessageMapping 注解&#xff1a;原理、用法与示例 前言 随着 Web 技术的发展&#xff0c;越来越多的应用程序开始使用 WebSocket 协议来实现实时通信。Spring Boot 提供了对 WebSocket 的支持&#xff0c;其中 MessageMapping 注解是一个常用的注解&#x…

【Keepalived】keepalived部署

1.keepalived二进制安装【Ubuntu20.04】 (1).官网下载二进制源码包 官网&#xff1a; https://keepalived.org/download.html 下载二进制包&#xff1a; wget https://keepalived.org/software/keepalived-2.2.7.tar.gz亦可通过window本地下载并上传 (2).解压文件 [rootu…

[ISO26262]汽车功能安全第二部分:功能安全管理

Road vehicles—Functionalsafety— Part 2: Management offunctionalsafety (ISO 26262-2:2011, MOD) GB/T34590《 道路车辆 功能安全》分为以下部分: TOPS:当前所浏览位置: 随着技术日益复杂、 软件和机电一体化应用不断增加, 来自系统性失效和随机硬件失效的风险逐渐…

蓝桥杯专题-试题版含答案-【两点距离】【字符串替换】【盗梦空间】【素数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

无向图讲解

讲完了有向图,咱再来讲一下无向图。 直观来说若一个图中每条边都是无方向的,则称为无向图,无向图中的边均是顶点的无序对,无序对通常用圆括号表示。 定义 无向图G=<V,E>,其中: 1.V是非空集合,称为顶点集。 2.E是V中元素构成的无序二元组的集合,称为边集。 解释 直…

如何选择适合的项目管理软件?你需要考虑这些问题

在市场上有很多项目管理软件可供选择&#xff0c;但是如何确定哪种工具最易使用&#xff0c;哪些功能是项目管理必备的呢&#xff1f;在选择项目管理软件之前&#xff0c;你需要考虑以下问题&#xff1a; 项目性质 不同的项目需要不同的管理方法&#xff0c;敏捷管理适用于某…

chatgpt赋能python:Python量化数据来源-介绍

Python量化数据来源 - 介绍 Python在金融量化分析领域中得到了广泛的应用&#xff0c;这部分应用通常被称为Python量化金融。Python量化数据来源是Python量化金融分析的基础&#xff0c;只有良好的数据来源才能保证分析的准确性和有效性。 Python具有以其代码简洁易懂、强大的…

2023年富媒体行业研究报告

第一章 行业概况 富媒体行业是一个快速发展的领域&#xff0c;它涵盖了从视频、音频、动画、互动内容到虚拟现实和增强现实等多种媒体形式。这些媒体形式的共同特点是&#xff0c;它们都能提供比传统文本和静态图像更丰富、更引人入胜的用户体验。 在中国&#xff0c;富媒体行…

深入JavaScript的运行原理

1 深入V8引擎原理 2 JS执行上下文 3 全局代码执行过程 4 函数代码执行过程 5 作用域和作用域链 源代码->抽象语法树->字节码。 其中的字节码在函数执行的时候&#xff0c;由于参数的类型是一样的&#xff0c;所以有优化的机器码&#xff0c;但是如果参数类型发生变化…

昌平GPU集群使用指南 - 非官方版

昌平GPU集群使用指南 - 非官方版 可以在网址导航里看平台的使用指南&#xff0c;本文只是有益补充&#xff01; &#xff08;注&#xff1a;镜像只需要关闭&#xff0c;不需要删除&#xff09; 大致操作流程&#xff1a; 进入protainer&#xff0c;进入containers&#xff0c…

Docker删除镜像,以及导入/导出镜像

总结一下&#xff1a;删除镜像&#xff0c;以及导入/导出镜像的步骤和命令。 一、删除 1.docker rmi remove images。该命令用于删除本地镜像。 镜像通过 指定。如果省略要删除镜像的 tag&#xff0c;默认删除的是 lastest 版本。 比如&#xff1a;docker rmi zookeeper 2.删…

互联网干洗店软件及营销功能介绍

互联网干洗店洗衣洗鞋软件收件、充值、上挂等门店基本功能统统都有&#xff0c;更是支持多店互联互通&#xff0c;连接小程序、公众号&#xff0c;招揽线上生意。 为单店或多门店连锁的经营模式提供一整套的软件系统&#xff0c;包含微信公众号和小程序。 工厂版 为门店中央奢护…

接口测试面试题及答案

Http与Https的区别&#xff1a; Http与Https的区别&#xff1a; HTTP 的URL 以http:// 开头&#xff0c;而HTTPS 的URL 以https:// 开头HTTP 是不安全的&#xff0c;而 HTTPS 是安全的HTTP 标准端口是80 &#xff0c;而 HTTPS 的标准端口是443在OSI 网络模型中&#xff0c;HTTP…

JMeter变量和和属性(4)

这里写目录标题 一、JMeter变量1、使用JMeter变量的作用有&#xff1a;2、定义变量的方式3、引用变量的方式4、引用变量5、案例&#xff1a;切换GreaterWMS的环境6、案例&#xff1a;测试平台登录案例 二、JMeter属性1、JMeter属性特点2、JMeter属性和变量的区别&#xff1a;3、…

9.用python写网络爬虫,完结

前言 这是python网络爬虫的最后一篇给大家做个总结&#xff0c;且看且珍惜把&#xff01; 截止到目前&#xff0c; 前几章本书介绍的爬虫技术都应用于一个定制网站&#xff0c;这样可以帮助我们更加专注于学习特定技巧。而在本章中&#xff0c;我们将分析几个真实网站&#xff…

Python matplotlib 设置多子图、子图间距、边距

Python matplotlib 设置多子图 设置多子图间距 设置多子图边距 1. 方式一 设置一个 2*2 的子图&#xff0c;子图共用X轴&#xff0c;不共用Y轴 import matplotlib.pyplot as pltfig,axes plt.subplots(2,2,figsize(6,6),dpi100,facecolor"w",sharexTrue,shareyFal…

基于Java+Swing+Mysql员工信息管理系统

基于JavaSwingMysql员工信息管理系统 一、系统介绍二、功能展示1.主页2.查询员工信息3.删除员工信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看员工列表、查询员工信息、删除员工信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示…

【Java】Java核心 78:Git 教程(1)Git 概述

文章目录 01.GIT概述目标内容小结 02.GIT相关概念目标内容小结 01.GIT概述 Git是一个分布式版本控制系统&#xff0c;常用于协同开发和版本管理的工具。它可以跟踪文件的修改、记录历史版本&#xff0c;并支持多人协同工作。通过Git&#xff0c;你可以轻松地创建和切换分支、合…

Redis最基础内容

文章目录 一、Redis简介1、特点&#xff1a;2、优势 二、启动Redis三、数据类型0、通用命令1、String(字符串)2、Hash类型3、List类型4、Set&#xff08;集合&#xff09;5、zset(sorted set&#xff1a;有序集合)6、各个数据类型使用场景 四、SpringDataRedis1、RedisTemplate…