新鲜出炉的 Spark 3.1.1香在哪?
注意:在spark官网可以看到以下说明,spark 3.1系列的第一个对外正式发布版是3.1.1而不是3.1.0, 因为3.1.0有技术问题没有对外发布(所以虽然在 Maven 仓库可以看到 Apache Spark 3.1.0 版本,但不要下载使用):
秉承着使 Spark 运行更快,使用更容易,和引擎更智能的一贯目标,Spark 3.1 在先前版本的基础上,进一步扩展了以下特性:
作为 project zen 的一部分,增加了 对Python type annotation和python 依赖管理的支持;
ANSI SQL 兼容性的进一步提升;
History Server中增加了对 structured streaming的支持;
kubernetes和standalone模式下,节点退役功能的GA;
查询性能的进一步优化提升;
Shuffle hash join 性能的进一步提升;
在本篇博文中,我们将简要介绍 Apache Spark 3.1.1 比较重要的一些特性和改进点。关于这些特性更加深入的完整的介绍,请留意砖厂近期陆续发布的系列博客。另外spark 3.1.1新增的完整的特性和解决的BUG,请参考spark3.1.1的release note.
ANSI SQL 兼容性
该版本进一步加强了对ANSI SQL 的兼容,从而简化了传统数据仓库负载到Spark 的迁移。要点如下:
ANSI SQL 方言模式从 Spark 3.0开始引入并在后续版本逐步增强。在 ANSI SQL方言模式下,Spark 的行为与 ANSI SQL 风格一致。在该版本中,当输入无效时(SPARK-33275),操作符/函数会抛出运行时错误而不是返回 NULL。该本队也会对 sql显式类型转换进行更严格的检查。当查询包含非法的类型转换时(例如,日期/时间戳类型被转换为数字类型),就会抛出编译时错误,通知用户这是无效的转换。需要注意的是,ANSI 方言模式仍然处于活跃的开发中,所以目前默认情况下该模式是禁用的,用户可以通过设置 spark.sql.ansi=true 来启用该模式。我们预期该模式在接下来发布的版本中会稳定下来。
该版本中添加了各种新的 SQL 特性。添加了广泛使用的 CHAR/VARCHAR 数据类型(该类型是String 类型的变体)。增加了更多的内置函数(例如 width_bucket (SPARK-21117)和 regexp_extract_all(SPARK-24884])。目前内置操作符/函数的数量已经达到350个。更多的DDL/DML/utility 命令得到了增强,包括 INSERT(SPARK-32976)、MERGE (SPARK-32030)和EXPLAIN (SPARK-32337)。从这个版本开始,在Spark WebUI 中,SQL 计划将以一种更简单、更结构化的格式呈现,比如使用 EXPLAIN FORMATTED 展示。
该版本完成了对 CREATE TABLE SQL 语法的统一。目前 Spark 维护了两组 CREATE TABLE 语法。当语句中不包含 USING 也不包含STORED AS 子句时,Spark使用默认的 Hive 文件格式。当 spark.sql.legacy.createHiveTableByDefault 被设置为 false (Spark 3.1 版默认为 true, Databricks Runtime 8.0 版默认为 false),默认的表的格式依赖于 spark.sql.sources.default 的设置 (Spark 3.1 版默认为 parquet, Databricks Runtime 8.0版默认为 delta)。这意味着在 Databricks Runtime 8.0 中 Delta Lake 是默认格式,该格式会提供更好的性能和可靠性。
下面的例子演示了当用户没有显式指定 USING 或 STORED AS 子句时,使用 CREATE TABLE SQL 语法在不同版本的效:
CREATE TABLE table1 (col1 int);
CREATE TABLE table2 (col1 int) PARTITIONED BY (partCol int);
下表展示了上面两个语句创建的表在不同版本中格式的变化:
注意,上图中的spark3.1版本,在Apache Spark中我们需要显示的将 spark.sql.legacy.createHiveTableByDefault
设置为 false,最终的表格式才会是parquet,否则将使用 Hive Text Serde。
性能提升
Catalyst 是对大多数 Spark 应用程序进行优化的查询编译器。在 Databricks,每天有数十亿个查询被优化和执行,这个版本增强了查询优化并加速了查询处理。
Predicate pushdown
谓词下推是最有效的性能特性之一,因为它可以显著减少扫描和处理的数据量。Spark 3.1 中完成了各种增强:
参见 SPARK-32858 和 SPARK-24994。
JSON 和 Avro 数据源(参见 SPARK-32346)支持谓词下推,ORC 数据源支持嵌套字段的谓词下推。
Filters 也可以通过 EXPAND 算子进行下推 (参见 SPARK-33302)。
Shuffle 消除,子表达式消除和嵌套字段修剪
Shuffle 消除(Shuffle removal),子表达式消除(subexpression elimination)和嵌套字段修剪(nested field pruning)是另外三个主要的优化特性。Shuffle是最昂贵的操作之一,在某些情况下可以避免 Shuffle (参见 SPARK-31869、SPARK-32282、SPARK-33399),但在消除 Shuffle 后,自适应查询规划可能不适用。此外,可以删除重复或不必要的表达式求值(参见 SPARK-33092、SPARK-33337、SPARK-33427、SPARK-33540)以减少计算量。列修剪可以应用于各种操作符(参见 SPARK-29721、SPARK-27217、SPARK-31736、SPARK-32163、SPARK-32059)中的嵌套字段,以减少 I/O 资源的使用,便于后续的优化。
Shuffle-Hash Join (SHJ) 支持所有的 join 类型
从这个版本开始 Shuffle-Hash Join (SHJ) 支持所有的 join 类型(SPARK-32399),同时支持相应的 codegen execution(SPARK-32421)。与 Shuffle-Sort-Merge Join (SMJ) 不同的是,SHJ 不需要排序,因此当 join 一个大表和一个小表时,SHJ 的 CPU 和 IO 效率比 SMJ 更高。注意,当构建端(build side)很大时,SHJ 可能会导致 OOM,因为构建 hashmap 是内存密集型的。
Streaming 的改进
Spark 是构建分布式流处理应用程序的最佳平台。Databricks 每天有超过10万亿的 records 通过 structured streaming 处理。该版本增强了 Structured Streaming 的监控、可用性和功能。
为了更好地调试和监控 Structured Streaming 应用程序,添加了历史服务器(History Server )支持(参见 SPARK-31953)。在 Live UI 中,添加了更多的 metrics(SPARK-33223)、水印间隔(watermark gap)(参见 SPARK-33224)和更多的状态自定义度量(state custom metrics)(参见 SPARK-33287)。
添加了新的 Streaming table APIs,用于读取和写 streaming DataFrame 到表中,就像 DataFrameReader 和 DataFrameWriter 中的 table API 一样。在 Databricks Runtime 中,推荐使用 Delta table 表格式,以实现精确一次(exactly-once)的语义和更好的性能。
Stream-stream Join 增加了两种新的 join 类型,这个版本中包括了 full outer (SPARK-32862) 和 left semi (SPARK-32863) join。在 Apache Spark 3.1 之前,已经支持了inner, left outer 以及 right outer stream-stream joins。
其他 Spark 3.1 的改进
除了以上新特性,该版本还关注了可用性、稳定性;改进和解决了大约1500个问题。该版本的发布是来自于超过200位的贡献者,包括个人和公司,如 Databricks,谷歌,苹果,Linkedin,微软,英特尔,IBM,阿里巴巴,Facebook, Nvidia, Netflix, Adobe 等。
上面我们重点介绍了 Spark 中一些关键的在 SQL、Python 和 streaming 方面的改进,限于篇幅 Apache Spark 3.1 中还有许多其他功能这里并没有涉及,比如 Spark on Kubernetes 的GA, node decommissioning, state schema validation 等,大家可以到 Apache Spark 3.1.1 Release Notes 和 Spark 的官方文档查找。
其它显著的特性包括:
参考链接
[1]
https://spark.apache.org/releases/spark-release-3-1-1.html
[2]
https://spark.apache.org/news/index.html
[3] https://databricks.com/blog/2021/03/02/introducing-apache-spark-3-1.html
[3] 各个 JIRA链接, 如:https://issues.apache.org/jira/browse/SPARK-33275,https://issues.apache.org/jira/browse/SPARK-31953
- EOF -
看完本文有收获?请转发分享给更多人
关注「大数据与机器学习文摘」,成为Top 1%
点赞和在看就是最大的支持❤️