演讲嘉宾简介:李潇,Databricks Spark研发部主管,Apache Spark committer,PMC member。
以下内容根据演讲视频以及PPT整理而成。
点击链接观看精彩回放:https://developer.aliyun.com/live/43188
本次分享主要围绕以下四个方面:
- Spark的起源
- Spark的今天
- Spark的最新进展
- Spark的未来
一、Spark的起源
Spark的创始人Matei于2007年开始在Berkeley读博,他对数据中心级别的分布式计算非常感兴趣。
彼时,一些互联网公司已经开始用几千台机器计算并存储数据。这样,Matei开始和Yahoo以及Facebook的团队合作,来解决工业界中的大数据问题。在这一过程中,他意识到了这些大数据技术的巨大潜能,不仅能应用于互联网公司,还能应用于科学数据集和工业数据集等场景。然而,这些技术还没有在这些场景里普及起来,所有的处理流水线都还依赖于专业的工程师实现。同时,大多数技术都仅局限于批处理,还缺少对交互式查询的支持。最后,这些技术还都不支持机器学习。
另外,Matei在Berkeley继续研究时发现,Berkeley的研究团体同样需要可扩展的数据处理器,特别是机器学习研究。
于是,Matei开始抓住这个契机和Lester合作,后者参加了Netflix的一个机器学习大赛。Matei根据具体的应用场景设计了一个编程模型,使得像Lester这样的应用者可以使用这个编程模型开发大数据应用软件。基于此,2009年Matei着手开发Spark,并在最初就收到了许多好评,Berkeley的许多大数据研究者们都使用Spark进行大数据应用开发和研究。
2010年,Matei将Spark开源。Spark的最初版本仅仅关注Map Reduce风格的计算,其网页如下图。相对于传统的Map Reduce, Spark具有更干净的API以及更好的性能。令人兴奋的是,Spark在开源两个月后就收到了社区的代码,这说明确实有开源社区成员使用Spark并且利用Spark做出了一些有趣的项目。
在接下来的两年,Matei投入了许多精力来拜访早期Spark用户,组织Meetup。在和一些早期用户接触后,Matei被这些早期案例震惊了:一些用户在用Spark做一些他从未想过的事情。比如,一些用户使用Spark做后端处理,以开发交互式应用。比如,一些神经科学家使用Spark实时监控动物大脑产生的信号,进行神经科学实验。还有一些创业公司使用Spark分析用户使用的社交媒体数据,利用Spark更新内存数据以进行流计算,而这发生在Spark提供流计算模块之前。另外,来自Yahoo的数据仓库团队使用Spark运行SQL query,运行R实现的数据科学业务,他们还将Spark engine共享给团队内部的许多用户,用户体量非常大。这些都坚定了Matei的信心,确定了Spark大有可为。
从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语言更加简单好用。
这些曾经的努力深深地影响着现在的Apache Spark。
二、Spark的今天
在Python方面,68%的Databricks的交互式notebook命令是用Python写的,是Scala的6倍,同时远远高于SQL这种广泛使用的数据库语言。这意味着,更多的程序员可以使用Spark进行数据处理和分析,而不仅仅局限于使用SQL的程序员。
在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。
在流处理方面,每天使用Databricks做流处理的数据超过5兆。Structured Streaming让流处理变得非常简单,能够轻松地将DataFrames和SQL计算变成流计算。近年来,使用Databricks做流计算的数据量每年翻4倍,增长非常迅速。
基于Spark的这些变化可以总结得到以下两个经验:
第一,易用性,即如何使用户更简单地使用和操作Spark以及如何帮助用户快速定位错误,这对于一个好的项目非常重要;
第二,Spark API的设计需要关注这些设计能否支持用户实现软件开发的最佳实践,比如通过组合不同库函数实现不同应用,同时支持可测试和模块化。API的设计还需要融入标准的编程环境,比如Python, Java, Scala, R等,以使其能够被方便地嵌入不同应用中。确保API的设计支持软件开发最佳实践,才能够使用户更安全和方便地使用它们。
以上是Spark已经做到的,随着时间的不断推进,Spark还将继续在这些方面不断完善。
三、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的最新进展。
SQL方面
近几年,SQL engine方面主要的改进就是Adaptive Query Execution (AQE)。AQE能够在运行时根据计算任务的特性更新计算计划,也就是execution plan,比如自动调整reducer数量,自动改变join算法,自适应地处理数据倾斜问题。AQE的这种能力让Spark变得更加简单易用,使得Spark使用者们不需要再繁冗地进行各种数据调优。
AQE可以自动调整reducer数量。过去,Dataframes上60%的集群都需要用户手动更改reducer数量,这使得用户不胜其扰,而AQE可以帮助解决这个问题。
AQE可以自动减小partition数量。在做聚合时,AQE还可以通过调整和合并小的partition,自适应地减小partition的数量,以减少资源浪费。
AQE还可以优化join操作。即使有高质量的数据统计信息,用户仍然很难获悉已经进行join操作的记录数。而AQE可以在join操作的初始阶段获悉数据的输入特性,并基于此选择适合的join算法从而最大地优化性能。
AQE还能够解决数据倾斜问题,通过调整不同key的数据来避免数据倾斜,从而提高性能。比如,在TPC-DS的查询问题上,AQE能够调整不同key以达到8倍的性能加速。这使得用户能够使用Spark处理更多数据,而不需要手动收集数据统计信息来优化性能。
AQE仅仅是Spark 3.0在性能方面的一种改进,提升Spark性能的例子还包括Dynamic partition pruning, Query compile speedups,以及Optimizer hints等。正如前文所述,Spark 3.0相比Spark 2.0的性能提速达到2倍,并且这种改进在真实场景下可能更明显。
除了性能,Spark 3.0在SQL的兼容性方面也有了很大的提升。比如,ANSI SQL方言做了标准化的SQL支持,使得其它SQL系统的负载和业务能够很容易转移到Spark SQL上。
Python方面
Spark 3.0在Python方面的改善包括易用性和性能。
对于易用性,Spark 3.0使用户能够更方便地定义Pandas UDFs。用户可以通过Python type hints指定其期待的数据格式和函数类型。在Spark 3.0中,用户可以仅仅指明数据的type,而不是写许多冗余的模板式代码,类似于Spark 2.0。
在性能方面,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。
Spark 3.0新功能分布在不同的模块上,比如阿里巴巴贡献的可用来监控流计算的Structured Streaming UI,可检测的流作业监控指标,全新的Spark language查询手册,新的Data Source API等。更多的Spark 3.0新功能可参见Xiao Li的讲座。
Spark生态圈的其它项目
除了Spark项目自身的发展,整个社区还围绕Spark做出了许多创新。去年,Databricks发布了Koalas项目,支持直接在Spark上运行Pandas API,使得更多的Pandas用户能够使用Spark解决大数据问题。Delta LAKE提供了可靠的表存储。社区还给Scikit learn, HYPEROPT, Joblib等添加了基于Spark的后端引擎,帮助它们解决大数据问题。Spark社区还和著名的基因公司一起开发了Glow项目,被大规模地应用于基因领域进行基因分析。Rapids提供了大量的数据科学和机器学习算法,使用GPU加速计算。最后,Databricks也进行了优化,改善了Spark和可视化系统的交互,使得用户可以快速地开发以Spark作后端引擎的交互式界面。
下面以Koalas为例展开具体介绍。
Koalas是Pandas API在Spark上的实现,能够使更多的数据科学代码直接运行在Spark上。从去年在Spark 3.0中发布至今,Koalas已经达到了每个月85万的下载量,大约是PySpark的1/5。未来Spark社区还将在Koalas上投入更多。
这次,Spark社区还发布了Koalas 1.0,具有以下特性:
第一,达到了80%的Pandas API覆盖率。
第二,由于Spark 3.0的发布,Koalas的性能也大大提升。
第三,能够支持更多的功能,包括missing values, NA以及in-place updates等。
第四,具有分布式的索引类型。
第五,能够非常方便地使用pip进行安装,对Python用户非常友好。
四、Spark的未来
在回顾了Spark的发展过程后,接下来再来展望数据科学的发展和数据驱动的AI进步。显然,Spark在过去的十年生逢其时,多次重大的决策导致Spark发展神速。然而,基于Spark开发大数据和AI应用仍然过于复杂,让基于Spark的应用开发变得更加简单仍大有可为。为此,Spark开源社区正在做更多的努力:
第一,要使数据的探索和使用变得更加简单,也就是数据科学和数据工程。
第二,还需要让Spark API更好地与生态圈的其它主流软件连接起来。
接下来介绍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中。
以Zen的Python Error Messages为例
在Spark 2.4中如果发生意味除零,用户会在Python Error Messages中得到冗长的错误信息,甚至还包括了大量的Java信息,这对Python程序员非常不友好。Spark 3.0中将简化Python Error Messages以避免冗余的错误信息,使用户能够快速查错。
Python文档
Spark社区还提供了对用户更加友好的Python文档,而之前的PySpark API文档存在许多无用的API。
Spark社区对Spark的未来非常有信心。有理由相信,Spark 3.0将解决更多问题,让大数据和AI数据处理变得更加简单!