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

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 今年是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

相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
相关文章
|
7月前
|
分布式计算 大数据 数据处理
Apache Spark:提升大规模数据处理效率的秘籍
【4月更文挑战第7天】本文介绍了Apache Spark的大数据处理优势和核心特性,包括内存计算、RDD、一站式解决方案。分享了Spark实战技巧,如选择部署模式、优化作业执行流程、管理内存与磁盘、Spark SQL优化及监控调优工具的使用。通过这些秘籍,可以提升大规模数据处理效率,发挥Spark在实际项目中的潜力。
558 0
|
2月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
55 1
|
5月前
|
分布式计算 大数据 Spark
Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享
《Spark大数据处理:技术、应用与性能优化》深入浅出介绍Spark核心,涵盖部署、实战与性能调优,适合初学者。作者基于微软和IBM经验,解析Spark工作机制,探讨BDAS生态,提供实践案例,助力快速掌握。书中亦讨论性能优化策略。[PDF下载链接](https://zhangfeidezhu.com/?p=347)。![Spark Web UI](https://img-blog.csdnimg.cn/direct/16aaadbb4e13410f8cb2727c3786cc9e.png#pic_center)
159 1
Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享
|
4月前
|
分布式计算 Hadoop 大数据
大数据处理框架在零售业的应用:Apache Hadoop与Apache Spark
【8月更文挑战第20天】Apache Hadoop和Apache Spark为处理海量零售户数据提供了强大的支持
69 0
|
4月前
|
分布式计算 Serverless 数据处理
EMR Serverless Spark 实践教程 | 通过 Apache Airflow 使用 Livy Operator 提交任务
Apache Airflow 是一个强大的工作流程自动化和调度工具,它允许开发者编排、计划和监控数据管道的执行。EMR Serverless Spark 为处理大规模数据处理任务提供了一个无服务器计算环境。本文为您介绍如何通过 Apache Airflow 的 Livy Operator 实现自动化地向 EMR Serverless Spark 提交任务,以实现任务调度和执行的自动化,帮助您更有效地管理数据处理任务。
224 0
|
5月前
|
分布式计算 Apache Spark
|
6月前
|
分布式计算 大数据 数据处理
Apache Spark在大数据处理中的应用
Apache Spark是大数据处理的热门工具,由AMPLab开发并捐赠给Apache软件基金会。它以内存计算和优化的执行引擎著称,提供比Hadoop更快的处理速度,支持批处理、交互式查询、流处理和机器学习。Spark架构包括Driver、Master、Worker Node和Executor,核心组件有RDD、DataFrame、Dataset、Spark SQL、Spark Streaming、MLlib和GraphX。文章通过代码示例展示了Spark在批处理、交互式查询和实时数据处理中的应用,并讨论了其优势(高性能、易用性、通用性和集成性)和挑战。【6月更文挑战第11天】
177 6
|
6月前
|
分布式计算 Spark 大数据
深入探究Apache Spark在大数据处理中的实践应用
【6月更文挑战第2天】Apache Spark是流行的开源大数据处理框架,以其内存计算速度和低延迟脱颖而出。本文涵盖Spark概述、核心组件(包括Spark Core、SQL、Streaming和MLlib)及其在数据预处理、批处理分析、交互式查询、实时处理和机器学习中的应用。通过理解Spark内部机制和实践应用,可提升大数据处理效率,发挥其在各行业的潜力。
|
6月前
|
消息中间件 分布式计算 关系型数据库
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
103 0
|
7月前
|
消息中间件 分布式计算 Serverless
CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark
CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark
126 2

推荐镜像

更多