Spark 3.3.0 版本发布

Apache Spark 3.3.0 是 3.x 系列的第四个版本。在开源社区的巨大贡献下,此版本解决了超过 1,600 个 Jira 票。

此版本通过布隆过滤器(Bloom filters)提高了 Join 查询性能,通过支持流行的 Pandas 功能如 datetime.timedelta 和 merge_asof 增加了 Pandas API 覆盖范围,通过改进 ANSI 兼容性并支持数十个新内置函数简化了从传统数据仓库的迁移,并通过更好的错误处理、自动补全、性能和性能分析提升了开发效率。

要下载 Apache Spark 3.3.0,请访问下载页面。您可以在 JIRA 上查阅详细更改。我们在此整理了按主要模块分组的高层级更改列表。

亮点

Spark SQL 和 Core

ANSI 模式

  • ANSI 模式下新的显式类型转换语法规则 (SPARK-33354)
  • 在 ANSI 模式下,如果索引为 null,Elt() 应返回 null (SPARK-38304)
  • 如果数组/映射中不存在元素,可选择返回 null 结果 (SPARK-37750)
  • 允许数值类型和时间戳类型之间进行类型转换 (SPARK-37714)
  • 默认禁用 ANSI 保留关键字 (SPARK-37724)
  • 使用存储赋值规则解析函数调用 (SPARK-37438)
  • 添加一个配置以允许日期时间类型和数值类型之间的类型转换 (SPARK-37179)
  • 添加一个配置以可选地强制执行 ANSI 保留关键字 (SPARK-37133)
  • 禁止 Interval 和 String 字面量之间的二进制操作 (SPARK-36508)

功能增强

性能增强

  • 全阶段代码生成
    • 为没有分组键的排序聚合添加代码生成 (SPARK-37564)
    • 为全外排序合并连接添加代码生成 (SPARK-35352)
    • 为全外洗牌哈希连接添加代码生成 (SPARK-32567)
    • 为存在排序合并连接添加代码生成 (SPARK-37316)
  • 下推(过滤器)
    • 通过 RebalancePartitions 下推过滤器 (SPARK-37828)
    • 下推布尔列过滤器 (SPARK-36644)
    • 如果连接条件为空,则为左半/反连接的右侧下推 limit 1 (SPARK-37917)
    • 支持通过 aggregate/union 传播空关系 (SPARK-35442)
    • 行级运行时过滤 (SPARK-32268)
    • 支持行级运行时过滤器中的左半连接 (SPARK-38565)
    • 支持对去重 CTE 进行谓词下推和列剪枝 (SPARK-37670)
  • 向量化
    • 实现 ConstantColumnVector 并改进隐藏文件元数据的性能 (SPARK-37896)
    • 启用 VectorizedPlainValuesReader.readBooleans 的向量化读取 (SPARK-35867)
  • 合并/删除/替换节点
    • 如果 union 之间有 project,则合并 union (SPARK-37915)
    • 如果可以安全地向上转换两个 cast,则合并为一个 cast (SPARK-37922)
    • 如果 Sort 是 RepartitionByExpression 的子级,则删除 Sort (SPARK-36703)
    • 如果外部连接仅在流侧具有带别名的 DISTINCT,则删除外部连接 (SPARK-37292)
    • 如果子级已排序,则将哈希聚合替换为排序聚合 (SPARK-37455)
    • 如果子级已排序,则将对象哈希替换为排序聚合 (SPARK-37557)
    • 仅当我们不复制昂贵的表达式时才折叠 project (SPARK-36718)
    • 在 RewritePredicateSubquery 之后删除冗余别名 (SPARK-36280)
    • 合并不相关标量子查询 (SPARK-34079)
  • 分区
    • 如果存在静态分区剪枝,则不添加动态分区剪枝 (SPARK-38148)
    • 改进 Optimizer 规则中的 RebalancePartitions (SPARK-37904)
    • 为 rebalance 分区添加小分区因子 (SPARK-37357)
  • 连接
    • 在 DynamicJoinSelection 中微调降级广播哈希连接的逻辑 (SPARK-37753)
    • 在为 SEMI/ANTI 洗牌哈希连接构建关系时忽略重复的连接键 (SPARK-36794)
    • 支持即使引入额外洗牌也优化倾斜连接 (SPARK-33832)
  • AQE
    • 支持在 AQE Optimizer 中消除限制 (SPARK-36424)
    • 在正常和 AQE Optimizer 中优化一行计划 (SPARK-38162)
  • Aggregate.groupOnly 支持可折叠表达式 (SPARK-38489)
  • ByteArrayMethods arrayEquals 应该快速跳过对未对齐平台的对齐检查 (SPARK-37796)
  • 向 CTESubstitution 规则添加树模式剪枝 (SPARK-37379)
  • 添加更多 Not 运算符简化 (SPARK-36665)
  • 在 UnwrapCastInBinaryComparison 中支持 BooleanType (SPARK-36607)
  • Coalesce 在第一个非空表达式之后删除所有表达式 (SPARK-36359)
  • 添加逻辑计划访问器以传播 DISTINCT 属性 (SPARK-36194)

内置连接器增强

  • 通用
    • 数据源中日期时间的宽松序列化 (SPARK-38437)
    • 在创建/更改表时,如果路径的第一个字母是斜杠,则将表位置视为绝对路径 (SPARK-38236)
    • 从空静态数字类型分区中移除前导零 (SPARK-35561)
    • 在数据源选项中支持 ignoreCorruptFilesignoreMissingFiles (SPARK-38767)
  • Parquet
    • 启用按字段 ID 匹配 schema 列名 (SPARK-38094)
    • 在 Parquet 中读写数据时移除检查字段名 (SPARK-27442)
    • 支持使用 Parquet DataPage V2 通过 RLE 编码向量化读取布尔值 (SPARK-37864)
    • 支持 Parquet V2 数据页面编码 (DELTA_BINARY_PACKED) 用于向量化路径 (SPARK-36879)
    • 在会话时区中重新基于 Parquet/Avro 元数据中保存的时间戳 (SPARK-37705)
    • 为聚合下推按分区列分组 (SPARK-36646)
    • Parquet 的聚合 (Min/Max/Count) 下推 (SPARK-36645)
    • 如果使用 G1GC 和 ON_HEAP,则通过 LONG_ARRAY_OFFSET 减少默认页面大小 (SPARK-37593)
    • 为 Parquet V2 支持实现向量化 DELTA_BYTE_ARRAY 和 DELTA_LENGTH_BYTE_ARRAY 编码 (SPARK-37974)
    • 支持 Parquet 向量化读取器中的复杂类型 (SPARK-34863)
  • ORC
  • JSON
    • 在 JSON 读取器中解析带引号的 NaN 和 Infinity 值时遵循 allowNonNumericNumbers (SPARK-38060)
    • 默认情况下,在 CSV/JSON 中对日期时间使用 CAST (SPARK-36536)
    • 在 Json 读取器中对 MapType 中不支持的键类型统一错误消息 (SPARK-35320)
    • 为 DataFrame.schema.csv/json(ds) 中尊重可空性添加一个旧版配置 (SPARK-35912)
  • CSV
    • 修复从 CSV 引用损坏记录列的问题 (SPARK-38534)
    • 默认情况下,null 值应保存为空而不是带引号的空字符串“” (SPARK-37575)
    • 加速 JSON/CSV 数据源中默认格式的时间戳类型推断 (SPARK-39193)
  • JDBC
    • 支持 JDBC V2 的级联模式 (SPARK-37929)
    • 向 DB2 方言 truncate 实现添加 IMMEDIATE 语句 (SPARK-30062)
    • 支持内置 JDBC 方言的聚合函数 (SPARK-37867)
    • 将 compileAggregates 从 JDBCRDD 移动到 JdbcDialect (SPARK-37286)
    • 在 JDBC (MySQL 方言) 中实现 dropIndex 和 listIndexes (SPARK-36914)
    • 支持 JDBC V2 MySQL 方言中的列表命名空间 (SPARK-38054)
    • 向 JDBCDialect 添加工厂方法 getConnection (SPARK-38361)
    • Jdbc 方言应该决定哪个函数可以下推 (SPARK-39162)
    • 在 JDBC 连接器提供程序中传播正确的 JDBC 属性并添加“connectionProvider”选项 (SPARK-36163)
    • 重构框架,使 JDBC 方言可以通过自身方式编译过滤器 (SPARK-38432)
    • 重构框架,使 JDBC 方言可以自行编译表达式 (SPARK-38196)
    • 在 DS V2 JDBC (MySQL 方言) 中实现 createIndex 和 IndexExists (SPARK-36913)
  • Hive
    • 支持写入 Hive 分桶表 (Parquet/ORC 格式,带 Hive 哈希) (SPARK-32709)
    • 支持写入 Hive 分桶表 (Hive 文件格式,带 Hive 哈希) (SPARK-32712)
    • 在客户端使用表达式过滤 Hive 分区 (SPARK-35437)
    • 支持 HiveTableScanExec 的动态分区剪枝 (SPARK-36876)
    • 如果 InsertIntoHiveDir 可转换,则应使用数据源 (SPARK-38215)

Data Source V2 API

  • 新接口
    • 引入新的 DataSource V2 接口 HasPartitionKey (SPARK-37376)
    • 添加接口 SupportsPushDownV2Filters (SPARK-36760)
    • 支持 DataSource V2 CreateTempViewUsing (SPARK-35803)
    • 添加一个类以表示 DS V2 中的通用聚合函数 (SPARK-37789)
    • 一个新框架,用于在 DS V2 API 中表示 Catalyst 表达式 (SPARK-37960)
    • 添加基于组的行级操作 API (SPARK-38625)
  • 迁移命令
    • 默认将 SHOW CREATE TABLE 迁移到使用 V2 命令 (SPARK-37878)
    • 默认将 CREATE NAMESPACE 迁移到使用 V2 命令 (SPARK-37636)
    • 默认将 DESCRIBE NAMESPACE 迁移到使用 V2 命令 (SPARK-37150)
  • 索引
  • 下推 (SPARK-38788)
    • 添加 DS V2 过滤器 (SPARK-36556)
    • 为数据源 V2 下推布尔列过滤器 (SPARK-36644)
    • 支持将 top N 下推到 JDBC 数据源 V2 (SPARK-37483)
    • DS V2 抽样下推 (SPARK-37038)
    • DS V2 LIMIT 下推 (SPARK-37020)
    • DS V2 支持部分聚合下推 AVG (SPARK-37839)
    • 支持数据源 V2 完全聚合下推 (SPARK-37644)
    • 如果 SumCountAny 伴随 distinct,则不能进行部分聚合下推 (SPARK-38560)
    • 翻译更多标准聚合函数以下推 (SPARK-37527)
    • DS V2 聚合下推支持带别名的 project (SPARK-38533)
    • DS V2 topN 下推支持带别名的 project (SPARK-38644)
    • DS V2 Top N 下推支持按表达式排序 (SPARK-39037)
    • 数据源 V2 支持部分 topN 下推 (SPARK-38391)
    • 支持将 Cast 下推到 JDBC 数据源 V2 (SPARK-38633)
    • 如果完全将 limit 下推到数据源,则从计划中移除 Limit (SPARK-38768)
    • DS V2 支持下推其他非聚合函数 (SPARK-38761)
    • DS V2 支持下推数学函数 (SPARK-38855)
    • DS V2 聚合下推支持按表达式分组 (SPARK-38997)
    • DS V2 聚合部分下推应该支持不带聚合函数的分组 (SPARK-39135)
  • 为数据源 V2 在 ORC 向量化读取器中支持嵌套列 (SPARK-36404)
  • 从 DS V2 自定义指标更新任务指标 (SPARK-37578)
  • 统一 SHOW CREATE TABLE 命令的 V1 和 V2 选项输出 (SPARK-37494)
  • 添加命令 SHOW CATALOGS (SPARK-35973)

Kubernetes 增强

  • Kubernetes 环境中的执行器滚动更新 (SPARK-37810)
  • 支持自定义 Kubernetes 调度器 (SPARK-36057)
  • executorIdleTimeout 在 K8s 上挂起的 Pod 中不起作用 (SPARK-37049)
  • 升级 kubernetes-client 到 5.12.2 (SPARK-38817)
  • 使内存开销因子可配置 (SPARK-38194)
  • 为 Spark on Kubernetes (实验性) 添加 Volcano 内置集成和 PodGroup 模板支持。(SPARK-36061, SPARK-38455)
  • 添加 KubernetesCustom[Driver/Executor]FeatureConfigStep 开发者 API (SPARK-37145)

节点退役

  • FallbackStorage 不应尝试解析任意“远程”主机名 (SPARK-38062)
  • ExecutorMonitor.onExecutorRemoved 应该将 ExecutorDecommission 视为已完成 (SPARK-38023)

基于推送的 Shuffle

  • 基于推送的 Shuffle 的自适应 Shuffle 合并最终化 (SPARK-33701)
  • 基于推送的 Shuffle 的自适应抓取 Shuffle 合并器 (SPARK-34826)
  • 跳过对基于推送的 shuffle 合并块的诊断 (SPARK-37695)
  • PushBlockStreamCallback 应该首先检查 isTooLate 以避免 NPE (SPARK-37847)
  • RemoteBlockPushResolver 中基于推送的合并最终化错误 (SPARK-37675)
  • 在重试期间,如果 shuffleMergeEnabled 对于 shuffleDependency 为 false,则避免获取合并状态 (SPARK-37023)

其他值得注意的更改

  • 为 BlockInfoManager 添加细粒度锁定 (SPARK-37356)
  • 支持将 Spark gpu/fpga 资源类型映射到自定义 YARN 资源类型 (SPARK-37208)
  • 如果倾斜,报告准确的 shuffle 块大小 (SPARK-36967)
  • 支持网络层的 Netty 日志记录 (SPARK-36719)

结构化流

主要功能

  • 引入 Trigger.AvailableNow,用于在多个批次中运行类似 Trigger.Once 的流式查询 (SPARK-36533)

其他值得注意的更改

  • 对有状态操作符使用 StatefulOpClusteredDistribution,同时遵守向后兼容性 (SPARK-38204)
  • 修复 flatMapGroupsWithState 在批处理中针对键的数据超时问题 (SPARK-38320)
  • 修复使用 RocksDB 状态存储提供程序的流-流外部连接的正确性问题 (SPARK-38684)
  • 升级 Kafka 到 3.1.0 (SPARK-36837)
  • Kafka 数据源支持 Trigger.AvailableNow (SPARK-36649)
  • 优化 RocksDB 状态存储提供程序的写入路径 (SPARK-37224)
  • 引入一个新的数据源,用于为每个微批次提供一致的行集 (SPARK-37062)
  • 对有状态操作符使用 HashClusteredDistribution,同时遵守向后兼容性 (SPARK-38204)
  • 使 foreachBatch 流式查询优雅停止 (SPARK-39218)

PySpark

Spark 上的 Pandas API

其他值得注意的更改

  • 突破性变化
    • 删除文档和 python/docs 中对 Python 3.6 支持的引用 (SPARK-36977)
    • 通过将内置 pickle 替换为 cloudpickle 来移除 namedtuple hack (SPARK-32079)
    • 将 pandas 最低版本提高到 1.0.5 (SPARK-37465)
  • 主要改进
    • 为 Python/Pandas UDF 提供性能分析器 (SPARK-37443)
    • PySpark 为 SQL API 使用 Python 的标准字符串格式器 (SPARK-37516)
    • 在 PySpark 异常中公开 SQL 状态和错误类 (SPARK-36953)
    • 当 Python worker 崩溃时尝试捕获 faulthanlder (SPARK-36062)
  • 主要功能
    • 在 Python 中实现 DataFrame.mapInArrow (SPARK-37228)
    • PySpark 为 SQL API 使用 Python 的标准字符串格式器 (SPARK-37516)
    • 添加 df.withMetadata pyspark API (SPARK-36642)
    • 支持 Python 的 timedelta (SPARK-37275)
    • 在 pyspark.sql.catalog 中公开 tableExists (SPARK-36176)
    • 在 pyspark.sql.catalog 中公开 databaseExists (SPARK-36207)
    • 在 pyspark sql catalog 中公开 functionExists (SPARK-36258)
    • 向 PySpark 添加 Dataframe.observation (SPARK-36263)
    • 向 PySpark 添加 max_by/min_by API (SPARK-36972)
    • 创建 DataFrame 时支持将嵌套字典推断为结构体 (SPARK-35929)
    • 向 Scala、Python 和 R 添加 bit/octet_length API (SPARK-36751)
    • 支持 Python 上的 ILIKE API (SPARK-36882)
    • 为 Python DataFrame API 添加 isEmpty 方法 (SPARK-37207)
    • 添加多列添加支持 (SPARK-35173)
    • 在 PySpark 中添加 SparkContext.addArchive (SPARK-38278)
    • 使 SQL 类型表示可评估 (SPARK-18621)
    • 在 python/pyspark/mllib 中为 fpm.py 内联类型提示 (SPARK-37396)
    • 实现 SeriesGroupBy.value_countsdropna 参数 (SPARK-38837)

MLLIB

  • 主要功能
    • 向 trainKMeansModel 添加 distanceMeasure 参数 (SPARK-37118)
    • 像 KMeans 等一样公开 LogisticRegression.setInitialModel (SPARK-36481)
    • 支持 CrossValidatorModel 获取每个 paramMap 指标的标准差 (SPARK-36425)
  • 主要改进
    • 通过延迟分配优化 MLlib 中的一些 treeAggregates (SPARK-35848)
    • 重写 _shared_params_code_gen.py 以在 ml/param/shared.py 中内联类型提示 (SPARK-37419)
  • 其他值得注意的更改

SparkR

UI

  • 阶段级别的推测指标摘要 (SPARK-36038)
  • 在 StagePage 中统一 shuffle 读取块时间到 shuffle 读取抓取等待时间 (SPARK-37469)
  • 在 UI 中为 SQL 执行添加修改的配置 (SPARK-34735)
  • 使 ThriftServer 识别 spark.sql.redaction.string.regex (SPARK-36400)
  • 应用程序在 UI 中启动后附加并启动处理程序 (SPARK-36237)
  • 向 SQL 选项卡图节点添加提交持续时间 (SPARK-34399)
  • 支持 Spark History Server 中的 RocksDB 后端 (SPARK-37680)
  • 在 UI 中显示 Spark 上的 Pandas API 选项 (SPARK-38656)
  • 在 SQL UI 页面中将“SQL”重命名为“SQL / DataFrame” (SPARK-38657)

构建

鸣谢

最后但并非最不重要的,此版本如果没有以下贡献者是不可能实现的:Abhishek Somani, Adam Binford, Alex Balikov, Alex Ott, Alfonso Buono, Allison Wang, Almog Tavor, Amin Borjian, Andrew Liu, Andrew Olson, Andy Grove, Angerszhuuuu, Anish Shrigondekar, Ankur Dave, Anton Okolnychyi, Aravind Patnam, Attila Zsolt Piros, BOOTMGR, BelodengKlaus, Bessenyei Balázs Donát, Bjørn Jørgensen, Bo Zhang, Brian Fallik, Brian Yue, Bruce Robbins, Byron, Cary Lee, Cedric-Magnan, Chandni Singh, Chao Sun, Cheng Pan, Cheng Su, Chia-Ping Tsai, Chilaka Ramakrishna, Daniel Dai, Daniel Davies, Daniel Tenedorio, Daniel-Davies, Danny Guinther, Darek, David Christle, Denis Tarima, Dereck Li, Devesh Agrawal, Dhiren Navani, Diego Luis, Dmitriy Fishman, Dmytro Melnychenko, Dominik Gehl, Dongjoon Hyun, Emil Ejbyfeldt, Enrico Minack, Erik Krogen, Eugene Koifman, Fabian A.J. Thiele, Franck Thang, Fu Chen, Geek, Gengliang Wang, Gidon Gershinsky, H. Vetinari, Haejoon Lee, Harutaka Kawamura, Herman van Hovell, Holden Karau, Huaxin Gao, Hyukjin Kwon, Igor Dvorzhak, IonutBoicuAms, Itay Bittan, Ivan Karol, Ivan Sadikov, Jackey Lee, Jerry Peng, Jiaan Geng, Jie, Johan Nystrom, Josh Rosen, Junfan Zhang, Jungtaek Lim, Kamel Gazzaz, Karen Feng, Karthik Subramanian, Kazuyuki Tanimura, Ke Jia, Keith Holliday, Keith Massey, Kent Yao, Kevin Sewell, Kevin Su, Kevin Wallimann, Koert Kuipers, Kousuke Saruta, Kun Wan, Lei Peng, Leona, Leona Yoda, Liang Zhang, Liang-Chi Hsieh, Linhong Liu, Lorenzo Martini, Luca Canali, Ludovic Henry, Lukas Rytz, Luran He, Maciej Szymkiewicz, Manu Zhang, Martin Tzvetanov Grigorov, Maryann Xue, Matthew Jones, Max Gekk, Menelaos Karavelas, Michael Chen, Michał Słapek, Mick Jermsurawong, Microsoft Learn Student, Min Shen, Minchu Yang, Ming Li, Mohamadreza Rostami, Mridul Muralidharan, Nicholas Chammas, Nicolas Azrak, Ole Sasse, Pablo Langa, Parth Chandra, PengLei, Peter Toth, Philipp Dallig, Prashant Singh, Qian.Sun, RabbidHY, Radek Busz, Rahul Mahadev, Richard Chen, Rob Reeves, Robert (Bobby) Evans, RoryQi, Rui Wang, Ruifeng Zheng, Russell Spitzer, Sachin Tripathi, Sajith Ariyarathna, Samuel Moseley, Samuel Souza, Sathiya KUMAR, SaurabhChawla, Sean Owen, Senthil Kumar, Serge Rielau, Shardul Mahadik, Shixiong Zhu, Shockang, Shruti Gumma, Simeon Simeonov, Steve Loughran, Steven Aerts, Takuya UESHIN, Ted Yu, Tengfei Huang, Terry Kim, Thejdeep Gudivada, Thomas Graves, Tim Armstrong, Tom van Bussel, Tomas Pereira de Vasconcelos, TongWeii, Utkarsh, Vasily Malakhin, Venkata Sai Akhil Gudesa, Venkata krishnan Sowrirajan, Venki Korukanti, Vitalii Li, Wang, Warren Zhu, Weichen Xu, Weiwei Yang, Wenchen Fan, William Hyun, Wu, Xiaochang, Xianjin YE, Xiduo You, Xingbo Jiang, Xinrong Meng, Xinyi Yu, XiuLi Wei, Yang He, Yang Liu, YangJie, Yannis Sismanis, Ye Zhou, Yesheng Ma, Yihong He, Yikf, Yikun Jiang, Yimin, Yingyi Bu, Yuanjian Li, Yufei Gu, Yuming Wang, Yun Tang, Yuto Akutsu, Zhen Li, Zhenhua Wang, Zimo Li, alexander_holmes, beobest2, bjornjorgensen, chenzhx, copperybean, daugraph, dch nguyen, dchvn, dchvn nguyen, dgd-contributor, dgd_contributor, dohongdayi, erenavsarogullari, fhygh, flynn, gaoyajun02, gengjiaan, herman, hi-zir, huangmaoyang2, huaxingao, hujiahua, jackierwzhang, jackylee-ch, jiaoqb, jinhai, khalidmammadov, kuwii, leesf, mans2singh, mcdull-zhang, michaelzhang-db, minyyy, nyingping, pralabhkumar, qitao liu, remykarem, sandeepvinayak, senthilkumarb, shane knapp, skhandrikagmail, sperlingxx, sudoliyang, sweisdb, sychen, tan.vu, tanel.kiis@gmail.com, tenglei, tianhanhu, tianlzhang, timothy65535, tooptoop4, vadim, w00507315, wangguangxin.cn, wangshengjie3, wayneguow, wooplevip, wuyi, xiepengjie, xuyu, yangjie01, yaohua, yi.wu, yikaifei, yoda-mon, zhangxudong1, zhoubin11, zhouyifan279, zhuqi-lucas, zwangsheng


Spark 新闻档案

最新消息

档案