介绍
Spark 3系列已经发布了第六版3.5.0,目前最新3.5.1。
- 使用最广泛的大数据可扩展计算引擎。
- 数以千计的公司,包括 80% 的财富 500 强企业,都在使用 Apache Spark。
- 来自业界和学术界的 2000 多名开源项目贡献者。
Apache Spark 3.5.0 是 3.x 系列中的第六个版本,该版本在开源社区的大力贡献下解决了超过 1,300 个 Jira 问题。
版本摘要
此版本在以下几个方面取得了显著进展:
-
对 Spark Connect 的适用场景进行了扩展,包括了对 Scala 和 Go 客户端的全面支持,提供了分布式训练与推理功能,并增强了对 Structured Streaming 的兼容性。
-
引入了新的 PySpark 和 SQL 功能,例如 SQL 中的 IDENTIFIER 子句、SQL 函数调用的命名参数支持、HyperLogLog 近似聚合的 SQL 函数支持,以及 Python 用户自定义表函数。
-
通过集成 DeepSpeed,简化了分布式训练的过程。
-
引入了水印(watermark)在各个算子间的传播机制。
-
在 Structured Streaming 中引入了 dropDuplicatesWithinWatermark 操作,使得在特定水印范围内去重数据成为可能。
Apache Spark 3.5.0 版本在提升连接服务、增强编程语言支持、丰富PySpark和SQL功能、优化分布式训练及强化流处理能力等方面均实现了重要改进与创新。
亮点内容
亮点内容:
-
Spark Connect 支持 Scala 和 Go 客户端 (SPARK-42554, SPARK-43351):Spark Connect 现已为 Scala 和 Go 语言提供客户端支持。
-
基于 PyTorch 的分布式机器学习支持 (SPARK-42471):Spark Connect 集成了对基于 PyTorch 的分布式机器学习的支持。
-
Python 和 Scala 中的 Spark Connect 结构化流处理支持 (SPARK-42938):在 Python 和 Scala 中增加了对 Spark Connect 结构化流处理功能的支持。
-
Python Spark Connect 客户端的 Pandas API 支持 (SPARK-42497):Python Spark Connect 客户端现在支持使用 Pandas API。
-
引入 Arrow Python UDFs (SPARK-40307):新增了对 Arrow Python 用户定义函数(UDFs)的支持。
-
支持 Python 用户定义表函数 (SPARK-43798):添加了对 Python 用户自定义表函数的支持。
-
将 PySpark 错误迁移到错误类上 (SPARK-42986):改进了 PySpark 错误处理机制,将其整合到专门的错误类中。
-
PySpark 测试框架 (SPARK-44042):推出了 PySpark 测试框架以方便进行单元测试。
-
添加对 Datasketches HllSketch 的支持 (SPARK-16484):内置了对 Datasketches HllSketch 数据结构的支持。
-
内置 SQL 函数改进 (SPARK-41231):提升了内置 SQL 函数的功能。
-
引入 IDENTIFIER 子句 (SPARK-43205):在 SQL 中引入了 IDENTIFIER 子句以支持特定语法特性。
-
将 SQL 函数添加到 Scala、Python 和 R API 中 (SPARK-43907):各编程接口现均支持直接调用 SQL 函数。
-
添加 SQL 函数的命名参数支持 (SPARK-43922):允许在调用 SQL 函数时使用命名参数。
-
当 Shuffle 数据迁移后避免因执行器下线而无谓地重新运行任务 (SPARK-41469):优化任务调度逻辑,减少不必要的任务重跑。
-
分布式 ML 与 Spark Connect 的集成 (SPARK-42471):加强了分布式机器学习与 Spark Connect 的结合。
-
DeepSpeed 分布式优化器支持 (SPARK-44264):集成 DeepSpeed 以简化分布式训练过程。
-
实现 RocksDB 状态存储的变更日志检查点 (SPARK-43421):改进了 RocksDB 状态存储的持久化机制。
-
引入水印在运算符间的传播 (SPARK-42376):在 Spark 中实现水印信息在不同运算阶段之间的传递。
-
引入 dropDuplicatesWithinWatermark 操作 (SPARK-42931):在结构化流处理中增加了根据水印去除重复数据的操作。
-
提升 RocksDB 状态存储提供程序的内存管理效能 (SPARK-43311):针对 RocksDB 状态存储进一步优化了内存管理机制。
值得一提
Spark Connect 相关改进与介绍
-
sql模块重构:为了在Scala Spark Connect客户端和Spark之间共享一个最小化的依赖集合,并避免拉取所有Spark的传递依赖项,将sql模块重构为sql和sql-api两个模块。(SPARK-44273)
-
Scala客户端引入:正式推出用于Spark Connect的Scala客户端,使得Scala开发者可以直接利用Spark Connect进行相关操作。(SPARK-42554)
-
Python Spark Connect客户端的Pandas API支持:为Python版Spark Connect客户端增添了对Pandas API的支持,用户可以更便捷地进行数据处理和分析。(SPARK-42497)
-
基于PyTorch的分布式ML支持:Spark Connect现已支持基于PyTorch的分布式机器学习功能,便于用户构建和部署大规模机器学习应用。(SPARK-42471)
-
Python和Scala中的结构化流处理支持:为Python和Scala环境下的Spark Connect增加了结构化流处理功能,使得用户可以更好地处理实时或连续的数据流。(SPARK-42938)
-
Go客户端初始版本发布:发布了Go语言版本的Spark Connect客户端初始版本,扩大了Spark Connect对更多开发者的语言覆盖范围。(SPARK-43351)
-
跨Python和Scala的Spark原生与Spark Connect客户端间的兼容性改进:对Spark原生API与Spark Connect客户端在Python和Scala环境下的兼容性进行了大量优化,确保了两者间顺畅协作。
-
客户端应用程序调试性和请求处理能力提升:增强了客户端应用的调试功能及请求处理性能,如异步处理、重试机制和长期查询等,以提高应用程序的稳定性和效率。
Spark SQL 新增功能详解
-
添加元数据列文件块起始位置和长度:SPARK-42423,Spark SQL 现在支持在元数据中记录列文件的块起始位置和长度信息。
-
在 Scala/Java sql() 方法中支持位置参数:SPARK-44066,在 Scala 和 Java API 中的
sql()
方法中添加了对位置参数的支持,使得可以通过索引方式传入 SQL 查询参数。 -
在函数调用解析器中添加命名参数支持:SPARK-43922,在 SQL 解析器中为函数调用增加了命名参数的支持,使得在调用函数时可采用“名称=值”的形式指定参数。
-
支持 INSERT INTO 语句源关系中带有 ORDER BY, LIMIT, OFFSET 的 SELECT DEFAULT:SPARK-43071,Spark SQL 现在允许在 INSERT INTO 语句中插入源表通过 ORDER BY、LIMIT 和 OFFSET 进行筛选后的 DEFAULT 行。
-
为 TVF(Table-Valued Function)调用添加 PARTITION BY 和 ORDER BY 子句的 SQL 语法:SPARK-44503,在 TVF 调用时可以在 TABLE 参数后紧跟 PARTITION BY 和 ORDER BY 子句。
-
在 DESCRIBE 和 SHOW CREATE TABLE 输出中包含列默认值信息:SPARK-42123,现在在 DESCRIBE 和 SHOW CREATE TABLE 命令的结果中会展示列的默认值。
-
为 Catalog.listCatalogs 添加可选模式参数:SPARK-43792,Catalog API 中的 listCatalogs 方法现在支持过滤返回结果,可以根据提供的可选模式匹配列出目录。
-
为 Catalog.listDatabases 添加可选模式参数:SPARK-43881,Catalog API 中的 listDatabases 方法也支持过滤返回结果,同样可根据提供的可选模式匹配列出数据库列表。
-
当准备好执行时触发回调:SPARK-44145,Spark SQL 引入了一个新功能,可在计划执行准备就绪时触发用户自定义的回调函数。
-
支持按名称插入(Insert By Name)语句:SPARK-42750,Spark SQL 现在支持按照列名而非列顺序来插入数据。
-
为 Scala API 添加 call_function 方法:SPARK-44131,在 Scala API 中新增 call_function 方法,以便直接从代码中调用 SQL 函数。
-
稳定的派生列别名:SPARK-40822,Spark SQL 改进了派生列的别名生成机制,确保其在整个查询过程中保持一致。
-
支持通用常量表达式作为 CREATE/REPLACE TABLE OPTIONS 的值:SPARK-43529,在创建或替换表时,选项参数(OPTIONS)现在可接受更为复杂的常量表达式作为值。
-
支持通过 INTERSECT/EXCEPT 操作符实现关联子查询:SPARK-36124,Spark SQL 已经能够处理含有关联条件的INTERSECT/EXCEPT子查询。
-
IDENTIFIER 子句:SPARK-43205,引入了 IDENTIFIER 子句,用于在 SQL 语句中更加灵活地引用和处理标识符(如表名、列名等)。
-
ANSI 模式下:Conv 函数在内部转换溢出时应返回错误:SPARK-42427,在遵循 ANSI 标准的模式下,当 Conv 函数进行数据类型转换时如果发生溢出,将会抛出错误。
其他
此外还有Core、PySpark、Structured Streaming、ML和UI等等诸多方面的改进。Spark 3.5还提示了将会移除对Java 8和Java 11的支持,改为最低Java 17。
小结
在技术创新与性能、生态扩展与兼容性、稳定性与易用性等方面全面提升,Apache Spark 3.5.0的发布对于整个大数据生态系统而言,不仅意味着性能和功能上的实质性飞跃,也是对当下及未来大数据处理需求的有力回应,通过不断演进与优化,巩固了Spark在大数据处理领域的领先地位。