【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,发明了一大堆没什么用的名词之后,最终发现这些操作都是花里胡哨,让开发者越陷越深。 最终你会发现一个真理&…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...