【Iceberg分析】Spark与Iceberg集成之常用存储过程
文章目录
- Spark与Iceberg集成之常用存储过程
- 调用语法
- 调用样例
- 表快照管理
- 快照回滚
- 根据snapshotid进行回滚
- 根据timestamp进行回滚
- 设置表当前生效的快照
- 表元数据管理
- 设置快照过期时间
- 清除孤岛文件
- 重写数据文件
- 运用参数示例
- options
- General Options
- Options for sort strategy
- Options for sort strategy with zorder sort_order
- 重写清单文件
- 重写位置删除文件
- Options
Spark与Iceberg集成之常用存储过程
spark与iceberg集成后,可以通过内置的存储过程来进行表的管理。使用CALL来调用存储过程。所有的存储过程在system的命名空间中。
官网地址
由于表迁移功能的风险较大,所以不去进行表的迁移,使用重建Iceberg表,重写数据的方式进行切换。
调用语法
catalog_name代表catalog的名称,procedure_name代表存储过程的名称,参数可以通过指定参数名的方式入参,也可以使用位移的方式入参。
CALL catalog_name.system.procedure_name(arg_name_2 => arg_2, arg_name_1 => arg_1);
CALL catalog_name.system.procedure_name(arg_1, arg_2, ... arg_n);
调用样例
SparkSession spark = SparkSession.builder().master("local").appName("Iceberg spark example").config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions").config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog").config("spark.sql.catalog.local.type", "hadoop") //指定catalog 类型.config("spark.sql.catalog.local.warehouse", "iceberg_warehouse").getOrCreate();spark.sql("CALL local.system.rollback_to_snapshot('iceberg_db.table2', 3285133177610707025) ");
表快照管理
快照回滚
根据snapshotid进行回滚
存储过程名 rollback_to_snapshot
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
snapshot_id | ✔️ | long | metadata文件中snapshots中的快照子项snapshot-id的值 |
根据timestamp进行回滚
存储过程名 rollback_to_timestamp
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
timestamp | ✔️ | timestamp | metadata文件中snapshots中的快照子项timestamp-ms的值 |
设置表当前生效的快照
存储过程名 set_current_snapshot
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
snapshot_id | long | 取metadata文件中snapshots中的快照子项snapshot-id的值 | |
ref | string | 快照引用,取metadata文件中refs中的分支名称或者标记名称 |
❗️ snapshot_id与ref只能取其一。
表元数据管理
设置快照过期时间
Iceberg中的每次write/update/delete/upsert/compaction都会生成一个新快照,同时保留旧数据和元数据,以便进行快照隔离和时间旅行。expire_snapshots过程可用于删除不再需要的旧快照及其文件。
这个过程将删除旧快照和那些旧快照唯一需要的数据文件。这意味着expire_snapshots过程永远不会删除未过期快照仍然需要的文件。
存储过程名 expire_snapshots
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
older_than | ️ | timestamp | 超过该时限的快照将被删除 ,默认是: 5天前的被删除 |
retain_last | int | 忽略 older_than作用, 而保留的快照数量 (defaults to 1) | |
max_concurrent_deletes | int | 用于删除文件操作的线程池大小(默认情况下不使用线程池) | |
stream_results | boolean | 为true时,删除文件将按 RDD 分区发送给 Spark 驱动程序(默认情况下,所有文件都将发送给 Spark 驱动程序)。建议将该选项设置为 true,以防止 Spark 驱动程序因文件大小而发生 OOM。 | |
snapshot_ids | array of long | 要过期的快照 ID 数组 |
如果省略 older_than 和 retain_last,则将使用表的expiration properties。仍被分支或标记引用的快照不会被删除。默认情况下,分支和标记永不过期,但可以使用表属性 history.expire.max-ref-age-ms 更改其保留策略。main分支永不过期。
❗️ 使用此存储过程时,必须增加stream_results且值为true。
清除孤岛文件
用于删除未在iceberg表的任何元数据文件中引用的文件,因此可视为 “孤岛”。
存储过程名 remove_orphan_files
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
older_than | ️ | timestamp | 删除在此时间戳之前创建的孤岛文件 (Defaults to 3 days ago) |
location | string | 查找文件的目录 (defaults to the table’s location) | |
dry_run | boolean | 预执行,若值为true,实际并未删除文件 (defaults to false) | |
max_concurrent_deletes | int | 用于删除文件操作的线程池大小(默认情况下不使用线程池) | |
file_list_view | string | 查找文件的数据集(跳过目录列表) | |
equal_schemes | map | 被视为相同的文件系统方案的映射。键是一个以逗号分隔的方案列表,值是一个方案 (defaults to map('s3a,s3n','s3')). | |
equal_authorities | map | 被视为等同的文件系统权限映射。键是以逗号分隔的权限列表,值是权限。 | |
prefix_mismatch_mode | string | 位置前缀(方案/授权)不匹配时的操作行为: ERROR- 抛出异常. (default) IGNORE - 啥也不干. DELETE - 删除文件. |
重写数据文件
Iceberg 在一个表格中跟踪每个数据文件。数据文件越多,存储在清单文件中的元数据也就越多,而数据文件过小则会导致不必要的元数据量和文件打开成本,从而降低查询效率。
Iceberg 可以使用 Spark 的 rewriteDataFiles 操作并行压缩数据文件。这将把小文件合并为大文件,以减少元数据开销和运行时文件打开成本。
存储过程名 rewrite_data_files
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
strategy | string | 策略名称 - 二进制包或排序。默认为 binpack 策略 | |
sort_order | string | 对于 Zorder,请在 zorder() 中使用逗号分隔的列列表。例如:zorder(c1,c2,c3)。否则,以逗号分隔的排序顺序格式为(ColumnName SortDirection NullOrder)。其中,SortDirection 可以是 ASC 或 DESC。NullOrder 可以是 NULLS FIRST 或 NULLS LAST。默认为表格的排序顺序 | |
options | ️ | map | 支持一些配置项 |
where | ️ | string | 用于筛选文件的字符串。请注意,所有可能包含匹配过滤器数据的文件都会被选中进行重写 |
运用参数示例
spark.sql("CALL catalog_name.system.rewrite_data_files(table => 'db.sample', options => map('min-input-files','2'))");
options
General Options
| 属性名称 | Default Value | 备注 |
|---|---|---|
max-concurrent-file-group-rewrites | 5 | 同时重写的最大文件组数 |
partial-progress.enabled | false | 是否“分步提交”,允许在完成整个重写之前提交文件组 |
partial-progress.max-commits | 10 | 如果启用了部分进度,允许此重写产生的最大提交次数 |
use-starting-sequence-number | true | 使用压缩开始时快照的序列号,而不是新生成快照的序列号 |
rewrite-job-order | none | |
target-file-size-bytes | 536870912 (512 MB, default value of write.target-file-size-bytes from table properties) | 重写输出文件大小 |
min-file-size-bytes | 75% of target file size | 低于此阈值的文件将被考虑重写,而不考虑任何其他标准 |
max-file-size-bytes | 180% of target file size | 文件大小超过此阈值时,将考虑重写,而不考虑任何其他标准 |
min-input-files | 5 | 任何文件组的文件数超过这个数量,都将被重写,而不考虑其他标准 |
rewrite-all | false | 强制重写所有提供的文件,优先于其他选项 |
max-file-group-size-bytes | 107374182400 (100GB) | 单个文件组中应重写的最大数据量。整个重写操作会根据分区和分区内文件组的大小分成若干块。这有助于分解超大分区的重写,否则由于群集的资源限制,这些分区可能无法重写。 |
delete-file-threshold | 2147483647 | 考虑重写数据文件所需的最少删除次数 |
Options for sort strategy
| 属性名称 | Default Value | 备注 |
|---|---|---|
compression-factor | 1.0 | shuffle 分区的数量以及 Spark 排序创建的输出文件数量取决于文件重写器使用的输入数据文件的大小。由于压缩,磁盘文件大小可能无法准确代表输出文件的大小。该参数允许用户调整用于估算实际输出数据大小的文件大小。系数大于 1.0 会生成比我们根据磁盘文件大小所预期的更多的文件。如果数值小于 1.0,根据磁盘上的文件大小,生成的文件将比我们预期的少 |
shuffle-partitions-per-file | 1 | 每个输出文件要使用的分区数量。iceberg会使用自定义的合并操作,将这些已排序的分区拼接成一个已排序的文件。 |
Options for sort strategy with zorder sort_order
| 属性名称 | Default Value | 备注 |
|---|---|---|
var-length-contribution | 8 | 从长度可变的输入列(字符串、二进制)中考虑的字节数 |
max-output-size | 2147483647 | ZOrder 算法中的字节交错量 |
重写清单文件
重写表的清单,优化扫描规划。
清单中的数据文件按分区规范中的字段排序。该程序使用 Spark 作业并行运行。
存储过程名 rewrite_manifests
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
use_caching | ️ | boolean | 在运行过程中使用 Spark 缓存(默认为 true) |
spec_id | ️ | int | 要重写的清单的规格 ID(默认为当前规格 ID) |
重写位置删除文件
Iceberg 可以重写位置删除文件,这样做有两个目的:
- 小型压缩: 将小的位置删除文件压缩成大文件。这样可以减少存储在清单文件中的元数据大小,并减少打开小的删除文件的开销。
- 删除悬而未决的删除记录: 过滤掉引用不再有效的数据文件的位置删除记录。重写数据文件后,指向重写数据文件的位置删除记录并不总是被标记为删除,而是会继续被表的实时快照元数据跟踪。这就是所谓的 “悬空删除 ”问题。
存储过程名 rewrite_position_delete_files
| 参数名称 | 是否必填 | 参数类型 | 备注 |
|---|---|---|---|
table | ✔️ | string | 表名 |
options | ️ | map | 支持一些配置项 |
在重写过程中,悬挂删除总是会被过滤掉。
Options
| 属性名称 | Default Value | 备注 |
|---|---|---|
max-concurrent-file-group-rewrites | 5 | 同时重写的最大文件组数 |
partial-progress.enabled | false | 是否“分步提交”,允许在完成整个重写之前提交文件组 |
partial-progress.max-commits | 10 | 如果启用了部分进度,允许此重写产生的最大提交次数 |
rewrite-job-order | none | |
target-file-size-bytes | 67108864 (64MB, default value of write.delete.target-file-size-bytes from table properties) | 重写输出文件大小 |
min-file-size-bytes | 75% of target file size | 低于此阈值的文件将被考虑重写,而不考虑任何其他标准 |
max-file-size-bytes | 180% of target file size | 文件大小超过此阈值时,将考虑重写,而不考虑任何其他标准 |
min-input-files | 5 | 任何文件组的文件数超过这个数量,都将被重写,而不考虑其他标准 |
rewrite-all | false | 强制重写所有提供的文件,优先于其他选项 |
max-file-group-size-bytes | 107374182400 (100GB) | 单个文件组中应重写的最大数据量。整个重写操作会根据分区和分区内文件组的大小分成若干块。这有助于分解超大分区的重写,否则由于群集的资源限制,这些分区可能无法重写。 |
相关文章:
【Iceberg分析】Spark与Iceberg集成之常用存储过程
文章目录 Spark与Iceberg集成之常用存储过程调用语法调用样例表快照管理快照回滚根据snapshotid进行回滚根据timestamp进行回滚 设置表当前生效的快照 表元数据管理设置快照过期时间清除孤岛文件重写数据文件运用参数示例optionsGeneral OptionsOptions for sort strategyOptio…...
[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。
[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候,发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候,其实软件本身的负载并不高,所以…...
云上考场小程序+ssm论文源码调试讲解
2 关键技术简介 2.1 微信小程序 微信小程序,简称小程序,英文名Mini Program,是一种全新的连接用户与服务的方式,可以快速访问、快速传播,并具有良好的使用体验。 小程序的主要开发语言是JavaScript,它与…...
城域网——IP城域网、城域以太网、光城域网
一、城域网 1、城域网(Metropolitan Area Network,MAN):一个城市范围内所建立的计算机通信网。 2、分布式队列双总线(Distributed Queue Dual Bus,DQDB):即IEEE802.6,由…...
华为Eth-trunk链路聚合加入到E-trunk实现跨设备的链路聚合
一、适用场景(注:e-trunk与eth-trunk是2个不同的概念) 1、企业中有重要的server服务器业务不能中断的情况下,可将上行链路中的汇聚交换机,通过eth-trunk链路聚合技术,实现链路故障后,仍有可用的…...
【网络安全】JSONP劫持原理及攻击实战
未经许可,不得转载。 文章目录 JSONP简介JSONP工作原理JSONP劫持Callback可定义问题JSONP简介 JSONP(JavaScript Object Notation Padding)是一种用于绕过浏览器同源策略限制的技术,使得网页可以从不同域名的服务器请求数据。由于浏览器的同源策略限制,网页通常只能向与其…...
VR全景摄影的拍摄和编辑软件推荐
随着虚拟现实技术的不断进步,VR全景摄影逐渐成为商业、娱乐和教育等多个领域中的重要工具。通过专业的设备与软件,摄影师能够创作出沉浸式的360度全景作品,为观众提供身临其境的视觉体验。在这篇文章中,我们将介绍VR全景摄影的相关…...
linux:使用sar诊断问题
使用sar诊断问题 1. CPU 使用情况2. 内存与交换3. 磁盘 I/O 活动4. 网络 I/O 活动5. 进程与上下文切换6. 系统调用与文件活动7. 电源管理8. 延迟分析9. 系统全局统计10. 查看历史记录11. 特定时间段12. 自动定时采样其他参数:使用实例: sar(S…...
CUDA编程技巧(不断搜集更新)
1 使用位运算替换部分乘法或除法 位移操作主要适用于无符号整数,对于带符号数的位移,特别是负数,可能会导致问题,如果你需要对负数执行除法或者乘法,最好谨慎使用位移运算。 1.1 替换除法 当需要将一个数除以 2、4、…...
云计算(第二阶段):mysql后的shell
第一章:变量 前言 什么是shell Shell 是一种提供用户与操作系统内核交互的工具,它接受用户输入的命令,解释后交给操作系统去执行。它不仅可以作为命令解释器,还可以通过脚本完成一系列自动化任务。 shell的特点 跨平台:…...
Debian12离线部署Mysql全网最详细教程
一、下载安装所需要的库 1、所需要的库 # 所需要的库有 libc6_2.36-9deb12u8_amd64.deb libgcc-s1_12.2.0-14_amd64.deb libstdc6_12.2.0-14_amd64.deb gcc-12-base_12.2.0-14_amd64.deb psmisc_23.6-1_amd64.deb libnuma1_2.0.18-1_amd64.deb libmecab2_0.996-14b14_amd64.d…...
文本生成视频技术:艺术与科学的交汇点
在人工智能技术的飞速发展下,文本生成视频(Text-to-Video)技术已经成为现实。这项技术能够根据文本描述生成相应的视频内容,极大地拓展了内容创作的边界。本文将从三个主要方面对文本生成视频技术进行深入探讨:技术能达…...
【Windows】【DevOps】Windows Server 2022 采用WinSW将一个控制台应用程序作为服务启动(方便)
下载WinSW 项目地址: GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license. 下载地址: https://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-x64.exe 参考配置模…...
OpenAI董事会主席Bret Taylor的Agent公司Sierra:专注于赋能下一代企业用户体验
本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结,2小时视频,5分钟阅读,加速内容学习与传播。 视频来源 youtube: https://www.youtube.com/watch?vriWB5nPNZEM&t47s 大纲 介绍 欢迎与介绍 介绍Bret Taylor&#x…...
【linux】信号(下)
8. 阻塞信号 (一)信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)进程可以选择阻塞 (Block )某个信号被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作(即被阻塞的信…...
Notepad++ 初学者指南
引言 对于初学者来说,选择合适的编程工具很重要,特别是考虑到易用性和计算机资源的需求。 虽然集成开发环境(IDE)如 Eclipse、IntelliJ IDEA 和 Visual Studio 提供了许多强大的功能,但对于刚开始学习编程的人来说&a…...
Web Socket 使用详解
在信息爆炸的时代,用户对网页的期待早已超越了静态内容的展示。实时聊天、股票报价、协同编辑等功能的实现,都离不开服务器与客户端之间持续、高效的数据交互。传统的HTTP请求-响应模型难以满足这种需求,而WebSocket的出现,为构建…...
【Python Web开发】Python Web开发知识全解析
Python Web开发知识全解析 Python 是一种强大的编程语言,以其简洁和高效而闻名,尤其在 Web 开发领域,它有着广泛的应用。Python 提供了许多功能强大且灵活的 Web 框架,如 Flask、Django、FastAPI 等,使得构建现代 Web…...
Android开发展开收起功能
Android开发展开收起功能 文字过长展开收起功能很普通,也很需要。 一、思路: 自定义控件MoreTextView 二、效果图: 三、关键代码: public class MoreTextView2 extends LinearLayout {/*** TextView的实际高度*/private int …...
Sealos Devbox 发布,珍爱生命,远离 CI/CD
水滴攻击太阳系用的是最原始的攻击方式:撞击!却又如此有效率。 当我们搞了一堆容器、编排、CI/CD、DevOps,发明了一大堆没什么用的名词之后,最终发现这些操作都是花里胡哨,让开发者越陷越深。 最终你会发现一个真理&…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
