Apache Spark 3.0:十年回顾,展望未来

简介: 今年是Spark发布的第十年,回顾Spark如何一步步发展到今天,其发展过程所积累的经验,以及这些经验对Spark未来发展的启发,对Spark大有脾益。在7月4日的Spark+AI SUMMIT 2020中文精华版线上峰会上,Databricks Spark研发部主管李潇带来了《Apache Spark 3.0简介:回顾过去的十年,并展望未来》的全面解析,为大家介绍了Spark的起源、发展过程及最新进展,同时展望了Spark的未来。

演讲嘉宾简介:李潇,Databricks Spark研发部主管,Apache Spark committer,PMC member。

以下内容根据演讲视频以及PPT整理而成。

点击链接观看精彩回放:https://developer.aliyun.com/live/43188
本次分享主要围绕以下四个方面:

  1. Spark的起源
  2. Spark的今天
  3. Spark的最新进展
  4. Spark的未来

一、Spark的起源

Spark的创始人Matei于2007年开始在Berkeley读博,他对数据中心级别的分布式计算非常感兴趣。

image.png
image.png

彼时,一些互联网公司已经开始用几千台机器计算并存储数据。这样,Matei开始和Yahoo以及Facebook的团队合作,来解决工业界中的大数据问题。在这一过程中,他意识到了这些大数据技术的巨大潜能,不仅能应用于互联网公司,还能应用于科学数据集和工业数据集等场景。然而,这些技术还没有在这些场景里普及起来,所有的处理流水线都还依赖于专业的工程师实现。同时,大多数技术都仅局限于批处理,还缺少对交互式查询的支持。最后,这些技术还都不支持机器学习。

image.png

另外,Matei在Berkeley继续研究时发现,Berkeley的研究团体同样需要可扩展的数据处理器,特别是机器学习研究。

于是,Matei开始抓住这个契机和Lester合作,后者参加了Netflix的一个机器学习大赛。Matei根据具体的应用场景设计了一个编程模型,使得像Lester这样的应用者可以使用这个编程模型开发大数据应用软件。基于此,2009年Matei着手开发Spark,并在最初就收到了许多好评,Berkeley的许多大数据研究者们都使用Spark进行大数据应用开发和研究。

image.png

2010年,Matei将Spark开源。Spark的最初版本仅仅关注Map Reduce风格的计算,其网页如下图。相对于传统的Map Reduce, Spark具有更干净的API以及更好的性能。令人兴奋的是,Spark在开源两个月后就收到了社区的代码,这说明确实有开源社区成员使用Spark并且利用Spark做出了一些有趣的项目。

image.png

在接下来的两年,Matei投入了许多精力来拜访早期Spark用户,组织Meetup。在和一些早期用户接触后,Matei被这些早期案例震惊了:一些用户在用Spark做一些他从未想过的事情。比如,一些用户使用Spark做后端处理,以开发交互式应用。比如,一些神经科学家使用Spark实时监控动物大脑产生的信号,进行神经科学实验。还有一些创业公司使用Spark分析用户使用的社交媒体数据,利用Spark更新内存数据以进行流计算,而这发生在Spark提供流计算模块之前。另外,来自Yahoo的数据仓库团队使用Spark运行SQL query,运行R实现的数据科学业务,他们还将Spark engine共享给团队内部的许多用户,用户体量非常大。这些都坚定了Matei的信心,确定了Spark大有可为。

image.png

从2012年到2015年,基于Spark的不同使用场景和需求,Spark团队开始扩展Spark以确保任何数据处理场景都可以使用Spark分担计算工作,用Spark解决数据处理问题。他们主要做了三方面努力:

第一,添加了Python, R以及SQL等编程语言入口,使得用户可以使用其熟悉的语言来使用Spark。
第二,添加了许多模块以完成不同数据处理任务,包括图处理、流处理。
第三,提供了更高层级的API以消除用户手动设置API的困扰,比如大家熟知的DataFrames API。DataFrames API是

Spark SQL中最受欢迎的API,和SQL Language一样。这是因为,DataFrames API会被SQL优化集优化,同时又与编程语言融合在一起,因此比SQL语言更加简单好用。

image.png

这些曾经的努力深深地影响着现在的Apache Spark。

二、Spark的今天

在Python方面,68%的Databricks的交互式notebook命令是用Python写的,是Scala的6倍,同时远远高于SQL这种广泛使用的数据库语言。这意味着,更多的程序员可以使用Spark进行数据处理和分析,而不仅仅局限于使用SQL的程序员。

image.png

在SQL方面,大约有90%的Spark API调用实际上跑在Spark SQL这个模块上。无论开发人员使用Python, Scala, Java或者R调用Spark,这些开发人员都实际受益于SQL engine的优化。在Databricks上,每天由Spark SQL处理的数据量都达到了exabytes量级。因此,整个社区在Spark SQL的投入相当大,这使得Spark SQL engine成为性能最好的开源SQL engine。在TPC-DS benchmark项目上,Spark 3.0中Spark SQL engine的性能比Spark 2.0整整快了两倍,比Presto快了1.5倍。今年年初,阿里巴巴的E-MapReduce团队使用Spark SQL engine打破了TPC-DS benchmark项目的最高性能记录。总的来说,Spark SQL engine是一个非常强大且高效的SQL engine。

image.png

在流处理方面,每天使用Databricks做流处理的数据超过5兆。Structured Streaming让流处理变得非常简单,能够轻松地将DataFrames和SQL计算变成流计算。近年来,使用Databricks做流计算的数据量每年翻4倍,增长非常迅速。

image.png

基于Spark的这些变化可以总结得到以下两个经验:

第一,易用性,即如何使用户更简单地使用和操作Spark以及如何帮助用户快速定位错误,这对于一个好的项目非常重要;
第二,Spark API的设计需要关注这些设计能否支持用户实现软件开发的最佳实践,比如通过组合不同库函数实现不同应用,同时支持可测试和模块化。API的设计还需要融入标准的编程环境,比如Python, Java, Scala, R等,以使其能够被方便地嵌入不同应用中。确保API的设计支持软件开发最佳实践,才能够使用户更安全和方便地使用它们。

以上是Spark已经做到的,随着时间的不断推进,Spark还将继续在这些方面不断完善。

image.png

三、Spark的最新进展

Spark 3.0是Spark有史以来最大的Release,共包含3400多个patch。下面这张图显示了这些patch所属的模块,几乎一半的patch都属于Spark SQL。Spark SQL的优化不仅服务于SQL language,还服务于机器学习、流计算和Dataframes等计算任务,这使得社区对Spark SQL的投入非常大。此外,Spark团队还付出了大量努力使Spark 2.0的用户方便地升级到3.0。

以下主要从SQL和Python两个方面讨论Spark的最新进展。

image.png

SQL方面
近几年,SQL engine方面主要的改进就是Adaptive Query Execution (AQE)。AQE能够在运行时根据计算任务的特性更新计算计划,也就是execution plan,比如自动调整reducer数量,自动改变join算法,自适应地处理数据倾斜问题。AQE的这种能力让Spark变得更加简单易用,使得Spark使用者们不需要再繁冗地进行各种数据调优。

AQE可以自动调整reducer数量。过去,Dataframes上60%的集群都需要用户手动更改reducer数量,这使得用户不胜其扰,而AQE可以帮助解决这个问题。

image.png

AQE可以自动减小partition数量。在做聚合时,AQE还可以通过调整和合并小的partition,自适应地减小partition的数量,以减少资源浪费。

image.png
image.png

AQE还可以优化join操作。即使有高质量的数据统计信息,用户仍然很难获悉已经进行join操作的记录数。而AQE可以在join操作的初始阶段获悉数据的输入特性,并基于此选择适合的join算法从而最大地优化性能。

AQE还能够解决数据倾斜问题,通过调整不同key的数据来避免数据倾斜,从而提高性能。比如,在TPC-DS的查询问题上,AQE能够调整不同key以达到8倍的性能加速。这使得用户能够使用Spark处理更多数据,而不需要手动收集数据统计信息来优化性能。

image.png

AQE仅仅是Spark 3.0在性能方面的一种改进,提升Spark性能的例子还包括Dynamic partition pruning, Query compile speedups,以及Optimizer hints等。正如前文所述,Spark 3.0相比Spark 2.0的性能提速达到2倍,并且这种改进在真实场景下可能更明显。

image.png

除了性能,Spark 3.0在SQL的兼容性方面也有了很大的提升。比如,ANSI SQL方言做了标准化的SQL支持,使得其它SQL系统的负载和业务能够很容易转移到Spark SQL上。

image.png

Python方面
Spark 3.0在Python方面的改善包括易用性和性能。

对于易用性,Spark 3.0使用户能够更方便地定义Pandas UDFs。用户可以通过Python type hints指定其期待的数据格式和函数类型。在Spark 3.0中,用户可以仅仅指明数据的type,而不是写许多冗余的模板式代码,类似于Spark 2.0。

image.png

在性能方面,Spark 3.0做了大量Apache Arrow的性能升级,20%-25%的性能提升来自于Apache Arrow自身。Spark 3.0还使用Apache Arrow实现了大量Python和R之间的数据交换,而这些对Spark使用者都是透明的。此外,Spark 3.0在SparkR方面的性能提升高达40倍,Spark还将提出更多的API来合并Pandas和Spark。

image.png

Spark 3.0新功能分布在不同的模块上,比如阿里巴巴贡献的可用来监控流计算的Structured Streaming UI,可检测的流作业监控指标,全新的Spark language查询手册,新的Data Source API等。更多的Spark 3.0新功能可参见Xiao Li的讲座。

image.png

Spark生态圈的其它项目

除了Spark项目自身的发展,整个社区还围绕Spark做出了许多创新。去年,Databricks发布了Koalas项目,支持直接在Spark上运行Pandas API,使得更多的Pandas用户能够使用Spark解决大数据问题。Delta LAKE提供了可靠的表存储。社区还给Scikit learn, HYPEROPT, Joblib等添加了基于Spark的后端引擎,帮助它们解决大数据问题。Spark社区还和著名的基因公司一起开发了Glow项目,被大规模地应用于基因领域进行基因分析。Rapids提供了大量的数据科学和机器学习算法,使用GPU加速计算。最后,Databricks也进行了优化,改善了Spark和可视化系统的交互,使得用户可以快速地开发以Spark作后端引擎的交互式界面。

image.png

下面以Koalas为例展开具体介绍。

Koalas是Pandas API在Spark上的实现,能够使更多的数据科学代码直接运行在Spark上。从去年在Spark 3.0中发布至今,Koalas已经达到了每个月85万的下载量,大约是PySpark的1/5。未来Spark社区还将在Koalas上投入更多。

image.png

这次,Spark社区还发布了Koalas 1.0,具有以下特性:

第一,达到了80%的Pandas API覆盖率。
第二,由于Spark 3.0的发布,Koalas的性能也大大提升。
第三,能够支持更多的功能,包括missing values, NA以及in-place updates等。
第四,具有分布式的索引类型。
第五,能够非常方便地使用pip进行安装,对Python用户非常友好。

image.png

四、Spark的未来

在回顾了Spark的发展过程后,接下来再来展望数据科学的发展和数据驱动的AI进步。显然,Spark在过去的十年生逢其时,多次重大的决策导致Spark发展神速。然而,基于Spark开发大数据和AI应用仍然过于复杂,让基于Spark的应用开发变得更加简单仍大有可为。为此,Spark开源社区正在做更多的努力:

第一,要使数据的探索和使用变得更加简单,也就是数据科学和数据工程。
第二,还需要让Spark API更好地与生态圈的其它主流软件连接起来。

image.png

接下来介绍Databricks在Apache Spark的接下来几个release中做出的具体努力。

Zen
第一个项目叫Zen,中文名是禅。Zen的项目名来自Python社区的项目Python Zen,其定义了设计Python的一系列原则,正是这些原则带来了Python社区如今的繁荣。Zen项目旨在提高Apache Spark在Python方面的可用性,Spark社区希望通过Zen项目让Spark Python的使用和Python生态圈的其它API一样易用。比如,提供更好的错误报告机制,将更易用的API加入Python的API中,进一步改善性能以使API更加Python化。

AQE
Spark社区还将继续优化AQE的动态优化能力,同时改善用户体验,避免额外的数据准备工作。

ANSI SQL
Spark社区还将标准化SQL语言支持,通过ANSI SQL使更多的主流SQL engine的工作能够迁移到Spark SQL中。

image.png

以Zen的Python Error Messages为例
在Spark 2.4中如果发生意味除零,用户会在Python Error Messages中得到冗长的错误信息,甚至还包括了大量的Java信息,这对Python程序员非常不友好。Spark 3.0中将简化Python Error Messages以避免冗余的错误信息,使用户能够快速查错。

image.png
image.png

Python文档
Spark社区还提供了对用户更加友好的Python文档,而之前的PySpark API文档存在许多无用的API。

image.png

Spark社区对Spark的未来非常有信心。有理由相信,Spark 3.0将解决更多问题,让大数据和AI数据处理变得更加简单!

image.png

相关实践学习
数据湖构建DLF快速入门
本教程通过使⽤数据湖构建DLF产品对于淘宝用户行为样例数据的分析,介绍数据湖构建DLF产品的数据发现和数据探索功能。
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
相关文章
|
3月前
|
机器学习/深度学习 SQL 分布式计算
Apache Spark 的基本概念和在大数据分析中的应用
介绍 Apache Spark 的基本概念和在大数据分析中的应用
159 0
|
3月前
|
机器学习/深度学习 SQL 分布式计算
介绍 Apache Spark 的基本概念和在大数据分析中的应用。
介绍 Apache Spark 的基本概念和在大数据分析中的应用。
|
6月前
|
分布式计算 资源调度 Java
|
6月前
|
SQL 分布式计算 Java
|
6月前
|
分布式计算 Hadoop 大数据
大数据Hadoop之——Apache Hudi 数据湖实战操作(Spark,Flink与Hudi整合)
大数据Hadoop之——Apache Hudi 数据湖实战操作(Spark,Flink与Hudi整合)
|
1月前
|
消息中间件 分布式计算 Serverless
CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark
CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark
53 2
|
3月前
|
SQL 分布式计算 数据处理
Apache Spark简介与历史发展
Apache Spark简介与历史发展
|
4月前
|
SQL 分布式计算 Apache
流数据湖平台Apache Paimon(六)集成Spark之DML插入数据
流数据湖平台Apache Paimon(六)集成Spark之DML插入数据
83 0
|
4月前
|
SQL 分布式计算 Apache
流数据湖平台Apache Paimon(五)集成 Spark 引擎
流数据湖平台Apache Paimon(五)集成 Spark 引擎
75 0
|
4月前
|
SQL 分布式计算 数据处理
[AIGC] Apache Spark 简介
[AIGC] Apache Spark 简介

推荐镜像

更多