开源技术 * IBM 微讲堂:Kubeflow 系列(观看回放 | 下载讲义) 了解详情

IBM Developer 博客

通过 IBM Developer 关注最新动态并获取信息

此版本是全球 440 多名贡献者经过 3400 多次修复和改进的结果。


Apache Spark 社区于 6 月 18 日宣布 Spark 3.0 正式发布,这是 3.x 系列的第一个主要版本。此版本包含许多新功能和改进。它是全球 440 多名贡献者经过 3400 多次修复和改进的结果。IBM 数据开源和人工智能技术中心 (CODAIT) 专注于机器学习、AI 工作流程、可信 AI、元数据和大数据处理平台等方面的多种精选开源技术,已完成了包括此 Spark 3.0 版本中的几个关键功能在内的约 200 项承诺。

Spark 3.0 亮点

版本 3.0 中引入了许多重要功能和改进:

  • 自适应查询执行 – 根据查询执行期间收集的运行时统计信息来重新优化和调整查询计划
  • 动态分区修剪 – 通过在哈希连接中复用维度表广播结果,优化了运行时期间的执行过程
  • SQL 兼容性 – 对 ANSI SQL 在语法、功能和存储分配策略等方面的合规性进行了许多增强
  • 语言 – 3.0 已迁移到 Python 3、Scala 2.12 和 JDK 11
  • PySpark – pandas API 中的重大改进
  • 用于结构化流的新 UI – 现在包含一个结构化流选项卡,该选项卡提供有关正在运行和已完成的查询统计的信息
  • 性能 – 调用 R 用户定义函数的速度提高了 40 倍,TPC-DS 基准测试的性能提高了 2 倍
  • 加速器感知型调度器 – 用户现在可以指定和使用硬件加速器(例如 GPU)来提高深度学习等任务的性能
  • SQL 参考文档 – 易于浏览的详细 Spark SQL 参考文档包含语法、语义、关键字和常见 SQL 用法示例

IBM 对 Spark 3.0 所做的贡献

在突出显示的功能中,IBM 已完成了 190 多个承诺,并为 Spark SQL、MLlib、PySpark、K8s 和 R 做出了贡献。此处简要概述了 IBM 对 Spark 3.0 所做的贡献。

Spark SQL

在 Spark 中,SQL 是所有高级库(包括 MLlib、Structural Streaming、PySpark 等)使用的数据处理组件。

增强的 explain 命令

SQL explain 命令非常重要,因为它会提供输入语句的逻辑/物理提示。当前的 explain 命令输出不便于用户理解,并且未包含所有详细信息。在 Spark 3.0 中,IBM 提供了以下功能来改进 explain 命令:

  1. SPARK-29366 – 输出 explain 中用于动态分区修剪 (DPP) 的子查询。
  2. SPARK-29092 – 报告有关扫描的其他信息,例如,下推式过滤器、分区过滤器以及 Explain 中的位置
  3. SPARK-27395 – 采用新的 explain 格式,使输出更便于用户理解
  4. SPARK-27480 – 改进 EXPLAIN DESC QUERY 以显示输入 SQL 语句

SQL 参考

Spark SQL 是 Apache Spark 生态系统中最活跃的组件:它提供了强大的 SQL 实现,是 Mllib、Structural Streaming 和 GraphX 功能的基础,并且正在迅速发展。但是,Spark SQL 与标准 SQL 语法之间存在一些差异。新用户可能很难学会 Spark SQL,因为有时候需要参考 Spark 源代码,而并非所有用户都能做到这一点。因此,提供一个适用于 Spark 3.0 的易于浏览的详细 Spark 3.0 参考文档(包括确切的语法和详细的示例)是至关重要的。有了这类文档,最终用户就不需要在学习 Spark SQL 语法时参考 Spark 源代码。IBM 推动了在 Umbrella Jira 中为最终用户构建 Spark SQL 综合参考的工作 SPARK-28588,其中包含大约 100 个子任务。

其他重要的 SQL 修复和增强功能

  • 添加了对 SQL 标准中的 EVERYANY (SOME) 聚集的支持 (SPARK-19851)
  • 支持 ANALYZE TABLE 中的 FOR ALL COLUMNS,用于在不指定列名的情况下收集所有列的统计信息 (SPARK-25458)
  • 使重要的 SQL 命令经过与 V2 命令相同的目录/表解析框架。这包含 SHOW PARTITIONS (SPARK-29539)、ALTER TABLE (RECOVER PARTITIONS) (SPARK-29612)、ALTER TABLE (DROP PARTITIONS) (SPARK-29643)、ALTER TABLE (RENAME PARTITIONS) (SPARK-29676)、ALTER TABLE SerDe 属性 (SPARK-29695)、ALTER VIEW QUERY (SPARK-29730) 以及 CREATEREPLACE VIEW (SPARK-29862)
  • 将左半开连接和左反连接推到项目、聚集、窗口、联合等操作程序下方 (SPARK-19712)
  • 使用 # 来标记嵌入在 SubqueryExec 操作程序内子查询名称中的表达式 ID (SPARK-27782)
  • PullupCorrelatedPredicates 优化器规则上实施幂等性 (SPARK-28375)
  • 将 JDBC 查询选项用于 Oracle 数据库 (SPARK-27596)
  • 将 .sql 测试转换为 UDF 集成测试库,其中包括 outer-join.sql (SPARK-28285)、pgSQL/join.sql (SPARK-28393)、except.sql (SPARK-28277) 和 having.sql (SPARK-28281)

Spark Core

Spark Core 是 Spark 的基本单元。IBM 已进行了一些重要改进,例如:

Spark MLlib

Spark ML 是 Spark 中的一个重要组件。它提供了一些可用于分布式系统上大型数据集的通用机器学习算法。Spark 3.0 将继续添加新的重要算法并改进现有算法。

实例权重支持

Spark ML 中的大多数算法都不支持样本权重,认为所有训练样本都具有同等重要性。Spark ML 在许多通用算法中增加了对样本权重的支持;IBM 为 KMeans (SPARK-29967) 和 BisectingKMeans (SPARK-30351) 提供了权重支持。

ML 变换程序多列支持

功能变换程序支持同时将多个输入列转换为输出列,此功能既方便又高效。Spark 3.0 针对多个变换程序添加了多列支持。其中,IBM 为 StopWordsRemover (SPARK-29808) 提供了多列支持,并为 QuantileDiscretizer (SPARK-22796) 和 StringIndexer (SPARK-22798) 提供了 Python 多列支持。

Scala 和 Python 之间的 ML 函数奇偶校验

在 Spark 3.0 之前,ML Scala 与 Python 在结构和层次结构方面都存在众多差异。这些差异会破坏奇偶校验,使源代码难以维护。IBM 为所有 Spark ML 算法(分类、聚类、评估、特征、频繁模式挖掘、推荐、回归)中的 Scala 和 Python 奇偶校验工作做出了贡献 (SPARK-28958)。

SparkR 中的幂迭代聚类支持

幂迭代聚类是一种简单的可扩展图形聚类方法,在处理大型数据集时速度非常快。IBM 致力于将该算法移植到 SparkR 上 (SPARK-19827)。

向梯度提升树添加拟合验证集的 Python 版本

使用 Python 向梯度提升树添加拟合验证集 (SPARK-24333)。

PySpark

IBM 一直在为 PySpark 做贡献,尤其是在 Arrow 和 pandas 中。这包括 Spark 3.0 中的以下重要改进:

  • 将 Apache/Arrow 升级到 0.12.0 (SPARK-26566)
  • 将最低 pandas 版本增加到 0.23.2 (SPARK-28041)
  • 使用 Arrow 改进 pandas(方法是通过发送乱序记录批处理来提高性能)(SPARK-25274)
  • 清理并整合 pandas UDF 功能 (SPARK-27163)
  • 在带时间戳记的 Arrow 到 pandas 转换中避免使用不必要的数据副本 (SPARK-30640)
  • 使 pandas 分组的 UDF 跳过空分区以提高性能 (SPARK-28128)

结束语

除了研究 Spark 3.0 功能和改进外,IBM 在 Spark 2020 峰会上还举行了三场会议:

IBM 致力于推动全球 AI、机器学习、大数据和分析工具的发展,并积极支持 Apache Spark 的持续改进。

本文翻译自:What’s new in Apache Spark 3.0(2020-06-30)