作者:高娜 李立伟 校验:许伟
Apache Iceberg 作为开放的应用于大规模数据的表格式,一直不断深耕相关领域,在此,我们非常荣幸的发布 Iceberg 0.14.0 版本!百位贡献者参与了 Iceberg 0.14.0 的开发,提交了近千个修复或优化,本篇将和大家一起分享此版本的亮点功能与改进!
在 0.14.0 版本中,Apache Iceberg 在如下方面取得了十足的进步:
在性能优化上做了大量工作,特别是在扫描计划阶段和 Spark 查询上
提供了一个通用的 REST catalog 客户端
Spark 3.2 及以上版本支持以 Merge-On-Read 的方式执行 Merge 和 UPDATE
支持使用 Z-Order 进行分区数据重写
在引擎集成上,添加了对 Flink 1.15 和 Spark 3.3 的支持
引入了全新的 Puffin 文件规范与实现,它将为大规模统计数据、索引提供支撑
全新的增量查询接口,包含 append 和 changelog 查询
FileIO 接口增加了对批量操作和范围读取的支持
增加了更多的元数据表来显示元数据树中的删除文件
作为面向大数据数据集的表格式,Iceberg 一直致力于为大家提供高性能的用户体验,在本次版本中,我们进行了大量的性能改进:
更新了删除过滤器以复制 row wrappers 以避免大量耗费资源的昂贵的类型分析
重构向量化阅读器,从而避免不必要的字典拷贝
Avro 文件支持 Zstd
通过填充字节来改进 Arrow decimal 处理器
Spark 默认开启 Parquet 向量化读取,同样的,我们在 Hive 3 上也添加了对应支持
更新了 Spark 表以避免昂贵(且不准确)的文件大小估算
快照过期支持并发执行
Hive 在扫描数据时将复制一个 reader 而非创建一个新的实例
性能改进不止于此,你可以通过我们的发布页面查看更多性能改进详情。
Puffin 是一种文件格式,用于存储 Iceberg 表数据的索引和统计数据等信息(这些数据并不直接存储在 Iceberg manifest 中 ) 。Puffin 文件可以包含任意数据片段(我们称之为 “blobs” ),以及解释它们所需的元数据。
索引对于提升查询性能起到了至关重要的作用,一直以来,用户对于 Iceberg 添加索引的诉求比较强烈,在这个版本中,我们听取了大家的反馈,设计并实现了 Puffin 文件来为 Iceberg 提供添加索引的高层抽象,它将是相关能力的基石,在社区进一步完善它之后,各式索引将很快到来,社区期待各位加入,携手共建。
详情参见:Puffin file format
Spark 3.3 及更高版本支持以下语句来进行时间旅行:
SELECT * FROM prod.db.table FOR SYSTEM_TIME AS OF '1986-10-26 01:21:00';
SELECT * FROM prod.db.table FOR SYSTEM_VERSION AS OF 10963874102873;
在行级操作上面,我们通常有 Copy-on-Write 和 Merge-on-Read 两种策略。
其中 Copy-on-Write 在数据写入时进行新文件生成,所以它把压力集中于写入端,而读取时不需要额外工作,很显然它适合对读性能有较高要求的场景;
而 Merge-on-Read 即读取时合并,将在查询时进行数据逻辑合并。当一批数据到来后,将直接排序并以列存或行存的形式写入新的文件,由于数据在写入时没有做去重或者更新合并,那么就需要在读取时进行 Merge,即合并多个版本的数据,仅保留最新的数据返回给查询者。这种方式写入的性能会很好,但是读取的性能较差,不适合对读性能要求很高的场景。
本版本 Iceberg 在 Spark 3.2 及更高版本上添加了 MOR 的支持,为用户提供了更多场景的适配。
Z-Order 最早是1966年提出的一项将映射多维数据到一维并按照这个维度进行排序的方法。随着数据库技术的发展,它被广泛应用到了数据库技术中。
通常为提高数据处理的效率,计算引擎要实现谓词的下推,而存储引擎可以根据下推的过滤条件尽可能的跳过无关数据或文件,但是当数据均匀分布在所有文件中时,那么这时数据跳过的能力就会失效。
Z-Order(Z阶曲线)有个非常重要的应用特性,就是降维。它可以将多维空间问题降维到低维或者一维空间问题。它将多列转换为一个Z-index列,按照其进行排序,根据 Z-Order 值相近的数据会分布到同一个文件中的特性,从数据整体来看也会呈现近似单调的分布。Z-order的核心是 File Skip 而非 Row Skip,它可以减少大量非必要的 IO,跳过大量文件。
用户可以通过 Spark Procedures 中的重写文件动作使用Z-order 重写策略进行表分区数据重写,从而大幅提升查询的性能。
在本版本中新增了一个通用的 REST catalog client,它为更多的高阶定制化提供了可能,让 Iceberg 更加灵活。
比如我们可以使用这个客户端规范实现一个自定义的 Iceberg Catalog 微服务,并将它放置到 Hive metastore 之前,提供各项监听、校验等动作,并完成自定义的扩展功能。
增量读取对于大数据场景愈发重要,本次版本实现了一个新的增量读取的接口(IncrementalAppendScan、IncrementalChangelogScan等),它为上层引擎提供了良好抽象及支撑。Sprak 及 Flink 将在后面的版本中基于新的接口完善增量读取场景能力。
新版本的 ManageSnapshots 以事务作为基础允许用户在一次提交中进行多项变更操作
通过快照引用来记录分支和标签
添加了对 all_data_files 和 all_manifests 表 的谓词下推的支持
在Spark UI 中显示 FileIO 的指标项
Spark 支持动态分区覆盖和过滤器覆盖的自定义隔离级别
Spark DROP TABLE 支持 PURGE 关键字
Spark 3.2 及更高版本支持 Scala 2.13
Flink 读取 HDFS 数据时支持位置信息上报
Flink Sink API 支持自定义参数
限制 Flink 流式读取时一次读入的快照数,抵御流量洪峰的冲击
ORC 支持滚动写入
Parquet 支持布隆过滤器
新版本还有很多精彩的内容及修复项,请查看完整的发行说明
Apache Iceberg 社区感谢对此版本做出贡献的每一位贡献者:
0xffmeta, Adam Szita, Ajantha Bhat, Alexander Jo, Amogh Jahagirdar, amogh-jahagirdar, Andre, Anjali Norwood, Anton Okolnychyi, Armin Najafi, Ashish Singh, Bijan Houle, BQ, Bryan Keller, cccs-eric, chakradhar2, Chen Zhang, Chen, Junjie, Cheng Pan, Christopher Lambert, chulucninh09, Đặng Minh Dũng, Daniel Weeks, Dhruv Pratap, Dmitri Bourlatchkov, Dongjoon Hyun, Edgar Rodriguez, Eduard Tudenhöfner, emkornfield, Eric Goodman, fallnirvana, Farooq Qaiser, felixYyu, Fokko Driesprong, ggershinsky, GoGoWen, Guillaume Massé, Gustavo Torres, Haizhou Zhao, happyprg, Harshit Mittal, Hongyue/Steve Zhang, Huaxin Gao, Jack Ye, jun-he, JustinLee, Kelvin Mok, Kent Yao, KnightChess, krisdas, Kyle Bendickson, László Pintér, liliwei, Limian (Raymond) Zhang, lixiaobao, Lothar, Luning (Lucas) Wang, LuNing (Lucas) Wang, Mingliang Liu, Nan Zhu, Neelesh Srinivas Salian, Nick Ouellet, openinx, Peidian li, Piotr Findeisen, polaris6, Prashant Singh, Pucheng Yang, pvary, Rajarshi Sarkar, renshangtao, Reo, Robert Stupp, Russell Spitzer, Ryan Blue, Samarth Jain, Samuel Redai, shidayang, southernriver, Sreeram Garlapati, Steven Zhen Wu, Sumeet Gajjar, Sung Yun, Szehon Ho, tal66, Thomas Prelle, Tim Jiang, Ulrich Konrad, vanliu, wangzeyu, William Hyun, Wing Yew Poon, wuwenchi, wuwenchi_deepnova, Xia, Xianyang Liu, Xiaoxuan, Xingfan Xia, xrl1, Yi Tang, Yonghua Jian_deepnova, Yufei Gu, Yuya Ebihara, zepyhr, Zhangg7723, zhaoym_deepnova, ZhongYujiang, zhoukang, zoucao 等

