欢迎光临散文网 会员登陆 & 注册

Python、流、SQL 有更新!耗时两年,Spark 3.0 重磅发布!

2020-07-15 10:45 作者:图灵社区  | 我要投稿


2020 年 6 月 19 日,经过近两年的开发之后,Apache Spark TM 3.0.0 版本终于面世了。据官方介绍,此次 Spark 3.0.0 版本更新了 3,400 多个补丁程序,将使 Python 和 SQL 在功能上更加强大,且易用性也会更强。

今年刚好是 Spark 开源项目成立 10 周年,让我们一起来看一下本次更新的亮点吧。


Spark 3.0中最大的新功能:

  • 通过自适应查询执行、动态分区修剪和其他优化,与 Spark 2.4 相比,Spark 3.0 性能提高了 2 倍;

  • 可兼容 ANSI SQL;

  • Pandas API 的重大改进,包括 Python 类型提示和增加额外的 Pandas UDF;

  • 优化了 Python 错误处理,简化了 PySpark 异常;

  • 结构化流媒体的新用户界面;

  • 调用R语言 UDF 速度提升最高达到了 40 倍;

  • 解决了 3400 个 Jira 问题,这些问题在 Spark 各个组件的分布情况如下:


Spark开源10周年


Spark 诞生于加州大学伯克利分校的 AMPlab,该实验室专注于数据密集型计算。AMPlab 的研究人员与大型互联网公司合作解决其数据和 AI 问题,但发现那些拥有大量且不断增长的数据量的公司都面临着同样的问题。于是,该团队开发了一个新引擎来处理这些新兴工作量,同时使开发人员可以更轻松地访问用于处理大数据的 API。

之后,由于社区的出现,Spark 扩展到了不同的领域,并产生了围绕流,Python 和 SQL 的新功能,这些模式现在构成了 Spark 的一些主要用例。持续的投入使 Spark 发展成如今的样子,成为数据处理,数据科学,机器学习和数据分析工作负载的事实引擎。

Apache Spark 3.0 将通过显着改善对 SQL 和 Python 的支持以继续保持这一趋势。


改进Spark SQL引擎


Spark SQL 是支持大多数 Spark 应用程序的引擎。例如,在 Databricks 上,超过 90% 的 Spark API 调用使用 DataFrame,Dataset 和 SQL API 以及由 SQL 优化器优化的其他库。这意味着即使 Python 和 Scala 开发人员也将其大部分工作通过 Spark SQL 引擎来进行完成。在 Spark 3.0 版本中,46% 的补丁于 SQL 有关,这些补丁显著提高了其性能和 ANSI SQL 兼容性。Spark 3.0 在总运行时间上的性能大约要比 Spark 2.4 好 2 倍。


Spark SQL引擎中的四个新功能


新的自适应查询执行(AQE)框架通过在运行时生成更好的执行计划来提高性能并简化调优,即使由于缺少/不正确的数据统计信息和错误估计的成本而使初始计划不理想。由于 Spark 的存储和计算是分离的,因此数据的到达可能无法预测。基于以上,Spark 运行时的自适应性变得比传统系统更为重要。故新版本引入了三个主要的自适应优化:

  • 动态聚结 shuffle 分区可简化甚至是避免调整 shuffle 分区的数量。用户可以在开始时设置相对较大的 shuffle 分区数量,AQE 会在运行时将相邻的小分区合并为较大的分区。

  • 动态切换连接策略可以在一定程度上避免由于缺少统计信息或错误估计大小而导致执行次优计划的情况。这种自适应优化可以在运行时自动将排序合并连接(sort-merge join)转换成广播哈希连接(broadcast-hash join),从而进一步提高性能。

  • 动态优化倾斜(skew)连接是另一个关键的性能增强。倾斜连接可能会导致负载的极度失衡并严重降低性能。在 AQE 从 shuffle 文件统计信息中检测到倾斜连接之后,它可以将倾斜分区拆分为较小的分区,并将它们与另一边的相应分区合并。这个优化可以让倾斜处理并行化,获得更好的整体性能。


在一个以 3TB TPC-DS 为基准的测试中,与没有 AQE 的 Spark 相比,具有 AQE 的 Spark 可以使两个查询的性能提高 1.5 倍以上,而对另外 37 个查询的性能提高 1.1 倍以上。


此外,当优化器无法在编译时识别其可以跳过的分区时,将使用“动态分区修剪”功能。这在星型模式中很常见(星型模式由一个或多个事实表组成,这些事实表引用了任意数量的维度表)。在这种联接操作中,我们可以通过识别过滤维度表而导致的分区来修剪联接从事实表中读取的分区。在 TPC-DS 基准测试中,102 个查询中的 60 个显示出 2 到 18 倍的显着加速。

ANSI SQL 的兼容性对于将工作负载从其他 SQL 引擎迁移到 Spark SQL 上至关重要。为了提升兼容性,新版本使用了 Proleptic Gregorian 日历,用户可以禁止使用 ANSI SQL 保留关键字作为标识符。同时,新版本针对数字类型的操作中引入了运行时溢出检查,并强制执行编译时类型检查。这些新的验证机制提高了数据质量。


增强Python API:PySpark和Koalas


现在 Python 是 Spark 上使用最广泛的语言,因此,它是 Spark 3.0 开发的重点关注领域。Databricks 上有 68% 的 Notebook 命令是使用 Python 编写的。PySpark 是 Apache Spark Python API,每月在 PyPI(Python 软件包索引)上的下载量超过 500 万。


许多 Python 开发人员使用 pandas API 进行数据结构和数据分析,但仅限于单节点处理。Databricks 表示将继续开发 Koalas(一种基于 Apache Spark 的 pandas API 的实现),以使数据科学家在分布式环境中处理大数据时更加高效。Koalas 消除了在 PySpark 中构建许多功能(例如,绘图支持)的需要,可以让数据科学家在整个集群中获得更高的性能。

经过一年多的开发,Koalas 实现了将近 80% 的 Pandas API。Koalas 在 PyPI 上的月下载量已迅速增长到 85 万,并以每两周发布一次的节奏快速演进。除了 Koalas,很多人仍在使用 PySpark API,该 API 也越来越受欢迎。

Spark 3.0对PySpark API进行了增强

  • 带有类型提示的新 Pandas API:Spark 2.3 中最初引入了 Pandas UDF,用于在 PySpark 中扩展用户定义的功能并将 Pandas API 集成到 PySpark 应用程序中。但是,当添加更多 UDF 类型时,现有接口很难理解。此版本引入了一个新的 Pandas UDF 接口,该接口利用 Python 类型提示来解决 Pandas UDF 类型泛滥的问题。新界面变得更具 Python 风格和自我描述性。

  • 新的 Pandas UDF 类型和 Pandas 函数 API:新版本增加了两种新的 Pandas UDF 类型,即系列迭代器到系列迭代器和多个系列迭代器到系列迭代器。这对于数据预取和昂贵的初始化操作来说很有用。此外,新版本还添加了两个新的 Pandas 函数 API,即 map 和 co-grouped map。

  • 更好的错误处理:PySpark 错误处理并不总是对 Python 用户友好。此版本简化了 PySpark 异常,隐藏了不必要的 JVM 堆栈跟踪,并使它们更具 Python 风格。

在 Spark 中改善对 Python 的支持和可用性仍然是我们的首要任务之一。


Hydrogen,流和可扩展性


Spark 3.0 完成了 Project Hydrogen 的关键组件,并引入了新功能来改善流传输和可扩展性。

  • 加速器感知调度:Hydrogen 项目是 Spark 的一项主要计划,旨在更好地统一 Spark 上的深度学习和数据处理。GPU 和其他加速器已被广泛用于加速深度学习工作负载。为了使 Spark 能够利用目标平台上的硬件加速器,新版本增强了现有调度程序,使群集管理器可以感知加速器。用户可以通过配置(点击获取配置地址)来指定加速器,然后调用新的 RDD API 来利用这些加速器。

  • 结构化流的新 UI:结构化流最初是在 Spark 2.0 中引入的。在 Databricks 的使用量同比增长 4 倍之后,每天有超过 5 万亿条记录通过结构化流在 Databricks 上处理。此版本添加了专用的新 Spark UI,用于检查这些流作业。这个新的UI提供了两组统计信息:1、已完成的流查询作业的聚合信息;2、关于流查询的详细统计信息。

  • 可观察的指标:持续监视数据质量的变化是管理数据管道的一项非常重要的功能。新版本引入了对批处理和流应用程序的监视功能。可观察的指标是可以在查询(DataFrame)上定义的任意聚合函数。一旦 DataFrame 的执行到达完成点(例如,完成批查询或到达流传输时代),就会发出一个命名事件,其中包含自上一个完成点以来处理的数据的度量。

  • 新的目录插件 API:现有的数据源 API 缺乏访问和操纵外部数据源的元数据的能力。新版本丰富了数据源 V2 API,并引入了新的目录插件 API。对于同时实现目录插件 API 和数据源 V2 API 的外部数据源,在注册了相应的外部目录之后,用户可以通过多部分标识符直接操作外部表的数据和元数据。

Spark 3.0中的其他更新


Spark 3.0 是社区的主要发行版,已解决 3,400 多个 Jira 问题。这是 440 多个贡献者共同努力的结果,这些贡献者包括个人以及Databricks,Google,Microsoft,Intel,IBM,Alibaba,Facebook,Nvidia,Netflix,Adobe 等公司。除了本文重点介绍的 Spark 在 SQL,Python 和流技术方面的一些关键改进,Spark 3.0 还有很多其他改进功能,详情可以查阅版本发行说明。发行文档中提供了更多信息,包括数据源、生态系统、监控等。


图书推荐:


由 Spark 开发者及核心成员共同打造,讲解了网络大数据时代应运而生的、能高效迅捷地分析处理数据的工具——Spark,它带领读者快速掌握用 Spark 收集、计算、简化和保存海量数据的方法,学会交互、迭代和增量式分析,解决分区、数据本地化和自定义序列化等问题。



本书是使用 Spark 进行大规模数据分析的实战宝典,由知名数据科学家撰写。本书在第 1 版的基础上,针对 Spark 近年来的发展,对样例代码和所使用的资料进行了大量更新。新版 Spark 使用了全新的核心 API,MLlib 和 Spark SQL 两个子项目也发生了较大变化,本书为关注 Spark 发展趋势的读者提供了与时俱进的资料,例如 Dataset 和 DataFrame 的使用,以及与 DataFrame API 高度集成的 Spark ML API。

Python、流、SQL 有更新!耗时两年,Spark 3.0 重磅发布!的评论 (共 条)

分享到微博请遵守国家法律