开源 Apache Software Foundation 的 Spark 社区最近发布了 Apache Spark v2.4.0。这是基于其 2.x 代码流的第五个主要版本。这一版中包含了全球近 200 位贡献者提供的约 1135 个 JIRA(新特性和错误修复)。与 2.x 代码流之前的版本相比,v2.4.0 中各种 JIRA 活动的规模表明 Spark 2.x 代码流正日趋成熟和稳定。自 IBM 积极参与该项目一直到最新的 v2.4.0 版,我们做出了巨大的贡献,在超过 1300 次提交中为 Spark Core、SQL、MLlib、Streaming、PySpark 和 SparkR 领域贡献了 69,000 多行新代码。随着机器学习和人工智能加速发展,IBM 的 Spark 技术中心还将其使命延伸到深度学习和 AI,并重新启动了开源、数据和 AI 技术中心 (CODAIT)。尽管我们在向深度学习转移,但 CODAIT 仍致力于同众多开发者和提交者一起改进 Spark 核心技术,开展开发者宣传工作,继续加速实现 Spark 的业务价值,推动企业将智能应用到业务中。在 Spark v2.4.0 中,IBM 持续提交了约 100 次,包含近 6000 行的新代码。您可在 CODAIT Spark JIRA 仪表板上找到我们最新贡献的数据。

版本说明中显示,Apache Spark v2.4.0 版主要通过添加重要的特性来改善实用性、稳定性和性能,比如添加 Barrier Execution Mode,从而与深度学习框架更紧密地集成;添加 30 多个内置高阶函数来处理复杂的数据类型;以及改进 Kubernetes 集成和 ORC 文件读取。其他重要更新包括内置了 Avro 数据源、图像数据源、灵活的流接收器;去除了传输期间的 2-GB 数据块大小限制;以及改进了 Pandas UDF。在版本说明里强调的众多特性中,有些是 IBM Spark 团队提供的。下面简单介绍一下这些特性。

支持 EXCEPT ALL/INTERSECT ALL (SPARK-21274)

在 SQL 中,集合运算可将多次查询的结果组合到单一结果集中。集合运算符包括 UNION、INTERSECT 和
EXCEPT。ALL 关键字与集合运算符结合使用时,可确保在结果集中保留重复的键。在 Spark 2.4 中,我们添加了对 EXCEPT ALL 和 INTERSECT ALL 的支持,旨在使 Spark Engine 符合 SQL 标准。例如,以下 EXCEPT ALL 查询会返回结果集 (NULL, 1, 1, 4)。

SELECT a FROM VALUES (1), (1), (1), (null), (null), (4) AS t1(a)
EXCEPT ALL
SELECT b FROM VALUES (1), (null), (3) AS t2(b)

以下 INTERSECT ALL 查询会返回结果集 (NULL, 1, 1)。

SELECT a FROM VALUES (1), (1), (1), (null), (null), (4) AS t1(a)
INTERSECT ALL
SELECT b FROM VALUES (1), (1), (null), (3) AS t2(b)

这是对 SQL 函数的一般性增强,所以普通 Spark 用户都会受益。更具体地来讲,IBM SQL Service 的客户可充分利用集合运算符的这种增强功能。

添加一个新选项,指定查询应从 JDBC 读取数据 (SPARK-24423)

Spark 提供了多个 API 来对 JDBC 数据源进行读取和写入操作。使用读取 API 读取 JDBC 表时,可以指定各种 JDBC 选项对通过网络传输的数据加以限制。Spark 2.4.0 引入了一个额外的 JDBC 选项 query,用于指定一个数据库表的表达式,以标识源表。像用户提供的谓词等其他数据限制选项一样,也可使用此选项限制在基础 JDBC 源与 Spark 之间交换的数据。例如:

val first_ten_rows_query = "select * from tableName limit 10"
val jdbcDf = spark.read
.format("jdbc")
.option("query", first_ten_rows_query)
.load()

为集合运算实现优先级规则 (SPARK-24966)

在 Spark 2.4 之前,多个集合运算符串连在一起时,Spark 会为所有运算符赋予相同的优先级,按照这些运算符在查询中出现的顺序从左向右执行它们。此行为不符合 SQL 标准的要求,与 UNION 和 EXCEPT 运算符相比,该标准为 INTERSECT 运算符赋予了更高的优先级。这种不一致在 Spark 2.4.0 中得到解决。

支持解析具有完全限定列名称的列 (SPARK-19602)

此特性现在支持 <db>.<table>.<column> 三部分形式的名称。Spark 现在可以解析完全限定的列名称,这有助于消除查询中的歧义。大多数 RDBMS 都支持这一点,例如 Db2。在 Db2 中,表示法为 <schema>.<table>.<column>。

为 lookupFunctions 缓存来自外部目录的函数名 (SPARK-23486)

引入此改进之前,如果在一个 SQL 查询中多次调用一个函数,则会不必要地访问元存储来解析该函数,这大大减缓了查询的进度。通过这个 pull 请求,Spark 会缓存来自外部目录的函数名,从而改善这些查询的性能。

支持符合 ANSI-SQL 的 GROUPING SET 语法 (SPARK-24424)

根据 SQL 标准,指定 GROUPING SET 时,列列表是可选的。在 2.4 版以前,甚至在指定 GROUPING SET 时,也需要显式指定列列表。2.4 版中已去除了此限制,分组规范已符合标准的要求。例如:

SELECT c1, c2, max(c3)
FROM t1
GROUP BY GROUPING SETS ((c1), (c1, c2))

在上面的示例中,没有在 group by 子句后指定列列表。

在 ANALYZE TABLE 中支持 FOR ALL COLUMNS (SPARK-25458)

Spark 2.4 中扩展了 ANALYZE 命令,用于收集一个表中所有列的统计数据。如果没有此语法,您必须显式指定列列表。

ANALYZE TABLE [db_name.]tablename COMPUTE STATISTICS FOR ALL COLUMNS;

在上面的例子中,会为指定表的所有列计算并记录表级和列级的统计数据。必须注意,不要为包含很多列的表使用此命令,因为计算统计数据成本很大,且耗费资源。

向 spark.ml 添加用于 PIC 的 Python API (SPARK-19826)

幂迭代聚类 (PIC) 是一种可扩展的图表聚类算法。在数据的归一化逐对相似矩阵上,它使用截断的幂迭代来查找数据集的超低维嵌入。事实证明,这种嵌入是一个有效的聚类指标,在真实数据集上的效率总是高于广泛使用的谱聚类方法,比如 NCut。PIC 在大型数据集上非常快,运行速度比基于最先进的 Rational Asset Manager 特征向量计算技术的 Ncut 实现快 1,000 多倍。

在 R 中添加对 EXCEPT ALL 和 INTERSECT ALL 的支持 (SPARK-25117)

在 Spark 2.4 中,对 R 数据集 API 进行了增强,添加了两个新方法 intersectAll 和 exceptAll,分别支持 INTERSECT ALL 和 EXCEPT ALL 运算。例如:

exceptAllDf <- exceptAll(df1, df2)

在 DataFrame 中添加 R partitionBy API (SPARK-21291)

在文件系统上,按给定的列对输出进行分区。如果指定了输出布局,文件系统上的输出布局类似于 Hive 的分区模式。分区是使用最广泛的物理数据布局优化技术之一。如果查询包含了分区列上的谓词,它可提供粗粒度的索引来跳过不必要的数据读取。要让分区很好地发挥作用,每列中不同值的数量通常不应超过几万。

添加 R 版本的数组运算符

  • 向 SparkR 添加 array_intersect/array_except/array_union/shuffle (SPARK-25007)
  • 在 SparkR 中添加 array_remove /array_zip /map_from_arrays /array_distinct (SPARK-24537)
  • 向 SparkR 添加 array_join 函数 (SPARK-24187)
  • 向 SparkR 添加 flatten 函数 (SPARK-24185)

采用 Arrow 来减少 toPandas() 集合的内存使用 (SPARK-23030)

通过从 Pandas 创建 Spark DataFrame 时和使用 toPandas() 收集 Spark DataFrame 时采用 Arrow 流格式,此特性改善了结合使用 Pandas 和 Spark 时的性能。

Pandas GroupedMap 用户定义函数混合使用列标签 (SPARK-24324)

此函数支持按名称对列建立索引,从而改善了 Spark 中的 Pandas GroupedMap 用户定义函数的实用性。

将 apache/arrow 升级到 0.10.0 版 (SPARK-23874)

将 Spark 中的 Apache Arrow 升级到 0.10.0 版,该版本包含许多改进和修复,还允许在 Pandas 运算中添加 BinaryType 支持 (SPARK-23555)

结束语

除了与 Apache Spark 社区持续合作,改善 Spark 的实用性、稳定性和性能外,IBM 还在研究其他一些特性,这些特性将改善 Spark 的数据联合功能,从而实现更高的性能。为了获得社区的认可,我们已提交这些特性的设计和初步性能结果,以期获得社区的反馈,这些特性包括:

  • 联接下移 (Join Push Down) (SPARK-24130)
  • 聚合下移 (Aggregate push down) (SPARK-22390)
  • 信息参照完整性约束支持 (Informational Referential Integrity Constraints Support) (SPARK-19842)

此外,我们提交了两个共包含 3000 多行新代码的 pull 请求,以便为依赖于参照完整性约束的查询优化技术打下基础。(SPARK-21784、SPARK-23750)。

本文翻译自 :IBM continues commitment to Apache Spark(2018-11-29)

加入讨论