acm-header
登录gydF4y2Ba

ACM通信gydF4y2Ba

贡献的文章gydF4y2Ba

Apache Spark:大数据处理的统一引擎gydF4y2Ba


Apache Spark:大数据处理的统一引擎,插图gydF4y2Ba

使用Spark对斑马鱼幼虫的大脑活动进行分析:将整个大脑活动的动态嵌入到低维轨迹中。gydF4y2Ba

图片来源:杰里米·弗里曼和米沙·阿伦斯/霍华德·休斯医学研究所gydF4y2Ba

工业和研究中数据量的增长带来了巨大的机遇,也带来了巨大的计算挑战。由于数据量已经超过了单机的能力,用户需要新的系统将计算扩展到多个节点。因此,针对不同计算工作负载的新集群编程模型出现了爆炸式增长。gydF4y2Ba1gydF4y2Ba,gydF4y2Ba4gydF4y2Ba,gydF4y2Ba7gydF4y2Ba,gydF4y2Ba10gydF4y2Ba起初,这些模型相对专业化,针对新的工作负载开发了新的模型;例如,MapReducegydF4y2Ba4gydF4y2Ba支持批处理,但谷歌也开发了DremelgydF4y2Ba13gydF4y2Ba用于交互式SQL查询和PregelgydF4y2Ba11gydF4y2Ba对于迭代图算法。在开源Apache Hadoop栈中,像StormgydF4y2Ba1gydF4y2Ba和黑斑羚gydF4y2Ba9gydF4y2Ba也是专业。即使在关系数据库世界中,趋势也是远离“一刀切”的系统。gydF4y2Ba18gydF4y2Ba不幸的是,大多数大数据应用程序需要结合许多不同的处理类型。“大数据”的本质是多样化和混乱;一个典型的管道将需要mapreduce类代码来进行数据加载、sql类查询和迭代机器学习。因此,专门的引擎会造成复杂性和效率低下;用户必须将不同的系统拼接在一起,有些应用程序根本无法在任何引擎中有效地表示。gydF4y2Ba

回到顶部gydF4y2Ba

关键的见解gydF4y2Ba

ins01.gif

2009年,我们在加州大学伯克利分校的团队启动了Apache Spark项目,为分布式数据处理设计统一引擎。Spark有一个类似于MapReduce的编程模型,但通过一个名为“弹性分布式数据集”(rdd)的数据共享抽象对其进行了扩展。gydF4y2Ba25gydF4y2Ba使用这个简单的扩展,Spark可以捕获以前需要单独引擎的广泛处理工作负载,包括SQL、流、机器学习和图形处理gydF4y2Ba2gydF4y2Ba,gydF4y2Ba26gydF4y2Ba,gydF4y2Ba6gydF4y2Ba(见gydF4y2Ba图1gydF4y2Ba).这些实现使用与专用引擎相同的优化(例如面向列的处理和增量更新),并实现了类似的性能,但在公共引擎上作为库运行,使它们更容易和高效地组合。我们认为这个结果更普遍,而不是特定于这些工作负载;当增加了数据共享后,MapReduce可以模拟任何分布式计算,因此它也应该可以运行许多其他类型的工作负载。gydF4y2Ba24gydF4y2Ba

Spark的通用性有几个重要的好处。首先,应用程序更容易开发,因为它们使用统一的API。第二,将处理任务结合起来效率更高;以前的系统需要将数据写入存储器,然后将其传递给另一个引擎,而Spark可以对相同的数据运行不同的功能,通常是在内存中。最后,Spark支持以前系统无法实现的新应用程序(如图形上的交互式查询和流机器学习)。对于统一的价值,一个有力的类比是将智能手机与之前存在的独立便携设备(如相机、手机和GPS设备)进行比较。通过统一这些设备的功能,智能手机实现了新的应用程序,将它们的功能(如视频消息和Waze)结合在一起,这在任何一种设备上都不可能实现。gydF4y2Ba

自2010年发布以来,Spark已经成长为最活跃的开源项目或大数据处理,有超过1000名贡献者。该项目在1000多个组织中使用,范围从科技公司到银行、零售、生物技术和天文学。公开宣布的最大部署有8000多个节点。gydF4y2Ba22gydF4y2Ba随着Spark的发展,我们一直在努力巩固其作为统一引擎的实力。我们(和其他人)继续在Spark上构建集成的标准库,功能从数据导入到机器学习。用户发现这种功能非常强大;在调查中,我们发现大多数用户在他们的应用程序中结合了多个Spark库。gydF4y2Ba

随着并行数据处理变得越来越普遍,处理函数的可组合性将成为可用性和性能方面最重要的考虑因素之一。许多数据分析是探索性的,用户希望将库功能快速组合到一个工作管道中。然而,尤其对于“大数据”来说,在不同系统之间复制数据是性能的诅咒。因此,用户需要通用的、可组合的抽象。在本文中,我们将介绍Spark编程模型,并解释它具有高度通用性的原因。我们还将讨论如何利用这种通用性来构建其他处理任务。最后,我们总结了Spark最常见的应用程序,并描述了项目中正在进行的开发工作。gydF4y2Ba

回到顶部gydF4y2Ba

编程模型gydF4y2Ba

Spark中关键的编程抽象是rdd,它是跨集群划分的对象的容错集合,可以并行操作。用户通过应用称为“转换”的操作(例如gydF4y2Ba地图、过滤gydF4y2Ba,gydF4y2BagroupBygydF4y2Ba)的数据。gydF4y2Ba

Spark通过Scala、Java、Python和R中的函数式编程API公开rdd,用户可以简单地传递本地函数在集群上运行。例如,下面的Scala代码通过搜索以“”开头的行来创建一个RDD,表示日志文件中的错误消息gydF4y2Ba错误gydF4y2Ba,然后打印错误总数:gydF4y2Ba

行= spark.textFile (hdfs: / /……)gydF4y2Ba

错误=线。过滤器(s => s.startsWith("ERROR"))

println(“总错误:”+ errors.count ())gydF4y2Ba

第一行将由HDFS中的文件支持的RDD定义为文本行的集合。第二行调用gydF4y2Ba过滤器gydF4y2Ba转换来派生一个新的RDDgydF4y2Ba行gydF4y2Ba.它的参数是一个Scala函数文字或闭包。gydF4y2Ba一个gydF4y2Ba最后,最后一行调用gydF4y2Ba数gydF4y2Ba,另一种类型的RDD操作称为“action”,它返回一个结果给程序(这里是RDD中元素的数量),而不是定义一个新的RDD。gydF4y2Ba

Spark对rdd的评估是惰性的,允许它为用户的计算找到一个有效的计划。特别是,转换返回一个表示计算结果的新RDD对象,但不立即计算它。当一个操作被调用时,Spark查看用于创建执行计划的整个转换图。例如,如果有多个gydF4y2Ba过滤器gydF4y2Ba或gydF4y2Ba地图gydF4y2BaSpark可以将它们融合到一次,或者,如果它知道数据是分区的,它可以避免在网络上移动gydF4y2BagroupBygydF4y2Ba.gydF4y2Ba5gydF4y2Ba因此,用户可以模块化地构建程序,而不会损失性能。gydF4y2Ba

最后,rdd为计算之间的数据共享提供显式支持。默认情况下,rdd是“短暂的”,因为它们每次在操作中被使用时会被重新计算(例如gydF4y2Ba数gydF4y2Ba).但是,用户也可以将选定的rdd持久保存在内存中,或用于快速重用。(如果数据不在内存中,Spark也会将其溢出到磁盘。)例如,在HDFS中搜索大量日志文件以调试问题的用户可能会通过调用整个集群将错误消息加载到内存中gydF4y2Ba

errors.persist ()gydF4y2Ba

在此之后,用户可以对内存中的数据运行各种查询:gydF4y2Ba

//计算MySQL的错误gydF4y2Ba

错误。过滤器(s => s.contains("MySQL")).count()

//取回错误的时间字段gydF4y2Ba

//提到PHP,假设time是字段#3:gydF4y2Ba

错误。过滤器(s => s.contains("PHP")).map(line => line.split('\t')(3)).collect()

这种数据共享是Spark与之前的计算模型(如MapReduce)之间的主要区别;否则,单个操作(如gydF4y2Ba地图gydF4y2Ba而且gydF4y2BagroupBygydF4y2Ba)是相似的。数据共享为交互查询和迭代算法提供了很大的加速,通常高达100倍。gydF4y2Ba23gydF4y2Ba这也是Spark的通用性的关键,我们将在后面讨论。gydF4y2Ba

容错。gydF4y2Ba除了提供数据共享和各种并行操作之外,rdd还可以从故障中自动恢复。传统上,分布式计算系统通过数据复制或检查点提供容错。Spark使用了另一种称为“血统”的方法。gydF4y2Ba25gydF4y2Ba每个RDD都会跟踪用于构建它的转换图,并在基础数据上重新运行这些操作,以重建任何丢失的分区。例如,gydF4y2Ba图2gydF4y2Ba显示了前面查询中的rdd,其中我们通过应用两个来获得提到PHP的错误的时间字段gydF4y2Ba过滤器gydF4y2Ba和一个gydF4y2Ba地图gydF4y2Ba.如果一个RDD的任何分区丢失(例如,如果一个节点持有一个内存中的分区gydF4y2Ba错误gydF4y2Ba失败),Spark将通过在HDFS文件对应的块上应用过滤器来重建它。对于将数据从所有节点发送到所有其他节点(例如gydF4y2BareduceByKeygydF4y2Ba),发送方将其输出数据持久化到本地,以防接收方出现故障。gydF4y2Ba

在数据密集型工作负载中,基于谱系的恢复比复制效率高得多。它既节省了时间(因为通过网络写入数据比写入RAM要慢得多),也节省了内存中的存储空间。恢复通常比简单地重新运行程序要快得多,因为一个失败的节点通常包含多个RDD分区,这些分区可以在其他节点上并行重建。gydF4y2Ba

一个长时间的例子。gydF4y2Ba举个更长的例子,gydF4y2Ba图3gydF4y2Ba展示了Spark中逻辑回归的实现。它使用批量梯度下降,这是一种简单的迭代算法,在数据上重复计算一个梯度函数作为并行和。Spark可以很容易地将数据一次加载到RAM中并运行多次求和。因此,它比传统的MapReduce运行得更快。例如,在100GB的作业中(参见gydF4y2Ba图4gydF4y2Ba), MapReduce每次迭代需要110秒,因为每次迭代从磁盘加载数据,而Spark在第一次加载后每次迭代只需要1秒。gydF4y2Ba

与存储系统集成。gydF4y2Ba与谷歌的MapReduce非常相似,Spark被设计为与多个外部系统一起使用,用于持久存储。Spark最常用于集群文件系统(如HDFS)和键值存储(如S3和Cassandra)。它还可以连接Apache Hive作为数据目录。rdd通常只在应用程序中存储临时数据,尽管有些应用程序(如Spark SQL JDBC服务器)也跨多个用户共享rdd。gydF4y2Ba2gydF4y2BaSpark作为一个与存储系统无关的引擎的设计,使用户可以轻松地对现有数据运行计算,并连接不同的数据源。gydF4y2Ba

回到顶部gydF4y2Ba

更高级别的图书馆gydF4y2Ba

RDD编程模型只提供要在其上运行的对象和函数的分布式集合。然而,通过使用rdd,我们已经在Spark上构建了各种各样的高级库,针对许多专门计算引擎的用例。关键思想是,如果我们控制存储在rdd中的数据结构、跨节点的数据分区以及在其上运行的函数,我们就可以在其他引擎中实现许多执行技术。实际上,正如我们在本节中所展示的,这些库通常在每个任务上都能实现最先进的性能,同时在用户将它们组合在一起时提供显著的好处。我们现在讨论Apache Spark包含的四个主要库。gydF4y2Ba

SQL和DataFramesgydF4y2Ba.最常见的数据处理范式之一是关系查询。火花SQLgydF4y2Ba2gydF4y2Ba以及它的前身鲨鱼,gydF4y2Ba23gydF4y2Ba在Spark上实现这样的查询,使用类似于分析数据库的技术。例如,这些系统支持列存储、基于成本的优化和用于查询执行的代码生成。这些系统背后的主要思想是在rdd中使用与分析数据库相同的数据布局和压缩柱状存储。在Spark SQL中,RDD中的每条记录都包含以二进制格式存储的一系列行,系统生成代码直接根据这种布局运行。gydF4y2Ba

除了运行SQL查询,我们还使用Spark SQL引擎为称为DataFrames的基本数据转换提供了更高层次的抽象,gydF4y2Ba2gydF4y2Ba它们是具有已知模式的记录的rdd。数据帧是R和Python中表格数据的常见抽象,具有用于过滤、计算新列和聚合的编程方法。在Spark中,这些操作向下映射到Spark SQL引擎并接收其所有优化。我们稍后将详细讨论数据框架。gydF4y2Ba

Spark SQL中还没有实现的一项技术是索引,不过Spark上的其他库(如indexedrdd)gydF4y2Ba3.gydF4y2Ba)一定要使用它。gydF4y2Ba

火花流gydF4y2Ba.火花流gydF4y2Ba26gydF4y2Ba使用称为“离散化流”的模型实现增量流处理。为了在Spark上实现流,我们将输入数据分成小批(例如每200毫秒一次),我们定期将这些数据与存储在rdd中的状态相结合,以生成新的结果。与传统的分布式流系统相比,以这种方式运行流计算有几个优点。例如,由于使用沿袭,故障恢复的成本更低,并且可以将流与批处理和交互查询结合起来。gydF4y2Ba

GraphXgydF4y2Ba.GraphXgydF4y2Ba6gydF4y2Ba提供了一个类似于Pregel和GraphLab的图形计算界面,gydF4y2Ba10gydF4y2Ba,gydF4y2Ba11gydF4y2Ba通过为其构建的rdd选择分区函数,实现与这些系统(如顶点分区方案)相同的位置优化。gydF4y2Ba

MLlibgydF4y2Ba.MLlib,gydF4y2Ba14gydF4y2BaSpark的机器学习库,实现了50多种用于分布式模型训练的通用算法。例如,它包括常见的分布式决策树(PLANET)算法、潜狄利克雷分配算法和交替最小二乘矩阵分解算法。gydF4y2Ba

结合处理任务gydF4y2Ba.Spark的库都在rdd上运行,作为数据抽象,使它们很容易在应用程序中组合。例如,gydF4y2Ba图5gydF4y2Ba展示了一个使用Spark SQL读取Twitter历史数据的程序,使用MLlib训练K-means聚类模型,然后将该模型应用到新的tweet流。每个库(这里是历史tweet RDD和K-means模型)返回的数据任务很容易传递给其他库。除了API级别的兼容性,Spark中的组合在执行级别也很高效,因为Spark可以进行优化gydF4y2Ba在gydF4y2Ba处理库。例如,如果一个库运行gydF4y2Ba地图gydF4y2Ba函数,下一个库运行gydF4y2Ba地图gydF4y2Ba根据其结果,Spark将把这些操作融合成一个单一的操作gydF4y2Ba地图gydF4y2Ba.同样,Spark的故障恢复在这些库之间无缝地工作,无论哪个库生成了丢失的数据,都可以重新计算它。gydF4y2Ba


Spark有一个与MapReduce类似的编程模型,但通过一个称为“弹性分布式数据集”(rdd)的数据共享抽象对其进行了扩展。gydF4y2Ba


性能gydF4y2Ba.假设这些库运行在相同的引擎上,它们会失去性能吗?我们发现,通过在rdd中实现我们刚刚概述的优化,我们通常可以匹配特定引擎的性能。例如,gydF4y2Ba图6gydF4y2Ba比较Spark在三个简单任务上的性能:SQL查询、流式单词计数和交替最小二乘矩阵分解与其他引擎。虽然结果因工作负载而不同,但Spark通常可以与Storm、GraphLab和Impala等专门系统相媲美。gydF4y2BabgydF4y2Ba对于流处理,尽管我们展示了来自Storm上分布式实现的结果,但每个节点的吞吐量也可以与商业流引擎(如Oracle CEP)相媲美。gydF4y2Ba26gydF4y2Ba

即使在竞争激烈的基准测试中,我们也使用Apache Spark实现了最先进的性能。2014年,我们进入了Daytona Gray-Sort基准测试(gydF4y2Bahttp://sortbenchmark.org/gydF4y2Ba)涉及在磁盘上对100TB的数据进行排序,并与一个专门用于在类似数量的机器上排序的系统创下了新的记录。正如在其他示例中一样,这是可能的,因为我们可以在RDD模型中实现大规模排序所需的通信和CPU优化。gydF4y2Ba

回到顶部gydF4y2Ba

应用程序gydF4y2Ba

Apache Spark用于广泛的应用程序中。我们对Spark用户的调查发现,使用Spark的公司超过1000家,涉及网络服务、生物技术和金融等领域。在学术界,我们也看到了在几个科学领域的应用。在这些工作负载中,我们发现用户利用了Spark的通用性,并经常结合多个库。在这里,我们将介绍一些顶级用例。关于许多用例的介绍也可在Spark Summit会议网站(gydF4y2Bahttp://www.spark-summit.orggydF4y2Ba).gydF4y2Ba

批处理gydF4y2Ba.Spark最常见的应用是对大型数据集进行批处理,包括Extract-Transform-Load工作负载,将数据从原始格式(如日志文件)转换为更结构化的格式,以及对机器学习模型进行离线培训。这些工作负载的公开示例包括Yahoo!的页面个性化和推荐;在高盛管理一个数据湖;阿里巴巴的图形挖掘;财务风险价值计算;以及对丰田客户反馈的文本挖掘。我们知道的最大的公开用例是中国社交网络腾讯的8000节点集群,每天吸收1PB的数据。gydF4y2Ba22gydF4y2Ba

虽然Spark可以在内存中处理数据,但这一类中的许多应用程序只能在磁盘上运行。在这种情况下,Spark仍然可以提高MapReduce的性能,因为它支持更复杂的操作符图。gydF4y2Ba

交互式查询gydF4y2Ba.Spark的交互使用分为三个主要类别。首先,组织使用Spark SQL进行关系查询,通常是通过Tableau这样的商业智能工具。例如eBay和百度。其次,开发人员和数据科学家可以通过shell或可视化的笔记本环境交互地使用Spark的Scala、Python和R接口。这种交互使用对于询问更高级的问题和设计最终导致生产应用程序的模型是至关重要的,并且在所有部署中都是常见的。第三,一些供应商已经开发了在Spark上运行的特定领域的交互应用程序。例子包括trresata(反洗钱)、Trifacta(数据清理)和PanTera(大规模可视化,如gydF4y2Ba图7gydF4y2Ba).gydF4y2Ba

流处理gydF4y2Ba.在分析和实时决策应用程序中,实时处理也是一个流行的用例。已经发布的Spark Streaming用例包括思科的网络安全监控、三星SDS的规范分析和Netflix的日志挖掘。许多这些应用程序还将流与批处理和交互式查询相结合。例如,视频公司Conviva使用Spark持续维护一个内容分发服务器性能模型,在跨服务器移动客户端时自动查询该模型,而该应用需要大量并行工作来进行模型维护和查询。gydF4y2Ba

科学应用gydF4y2Ba.Spark还被用于多个科学领域,包括大规模垃圾邮件检测,gydF4y2Ba19gydF4y2Ba图像处理、gydF4y2Ba27gydF4y2Ba基因组数据处理。gydF4y2Ba15gydF4y2Ba一个结合了批处理、交互和流处理的例子是位于Janelia Farm的Howard Hughes医学研究所的雷声神经科学平台。gydF4y2Ba5gydF4y2Ba它的设计目的是实时处理来自实验的脑成像数据,从生物(如斑马鱼和老鼠)的全脑成像数据可扩展到每小时1TB。利用Thunder,研究人员可以应用机器学习算法(如聚类和主成分分析)来识别参与特定行为的神经元。同样的代码可以在对以前运行的数据的批处理作业中运行,也可以在实时实验期间的交互查询中运行。gydF4y2Ba图8gydF4y2Ba显示了使用Spark生成的示例图像。gydF4y2Ba

Spark组件使用gydF4y2Ba.因为Spark是一个统一的数据处理引擎,很自然的问题是组织实际使用了多少它的库。我们对Spark用户的调查显示,组织确实使用多种组件,超过60%的组织使用至少三种Spark api。gydF4y2Ba图9gydF4y2BaDatabricks在2015年7月对1400名受访者进行了Spark调查,概述了每个组件的使用情况。我们将Spark Core API(只是rdd)列为一个组件,将高级库列为其他组件。我们看到许多组件被广泛使用,其中Spark Core和SQL是最受欢迎的。46%的组织使用流媒体,54%的组织使用机器学习。虽然没有直接显示在gydF4y2Ba图9gydF4y2Ba在美国,大多数组织使用多个组件;88%的人至少使用其中的两个,60%的人至少使用三个(比如Spark Core和两个库),27%的人至少使用四个组件。gydF4y2Ba

部署环境gydF4y2Ba.我们还看到Apache Spark应用程序在何处运行以及它们连接到哪些数据源方面的多样性在不断增加。虽然最初的Spark部署通常是在Hadoop环境中进行的,但在我们2015年7月的Spark调查中,只有40%的部署是在Hadoop YARN集群管理器上进行的。此外,52%的受访者在公共云上运行Spark。gydF4y2Ba

回到顶部gydF4y2Ba

为什么星火型通用?gydF4y2Ba

虽然Apache Spark证明了统一的集群编程模型既可行又有用,但理解是什么使集群编程模型具有通用性以及Spark的局限性会很有帮助。在这里,我们总结了Zaharia关于rdd普遍性的讨论。gydF4y2Ba24gydF4y2Ba我们从两个角度研究rdd。首先,从表达性的角度来看,我们认为rdd可以模拟任何分布式计算,并且在许多情况下可以有效地模拟,除非计算对网络延迟非常敏感。其次,从系统的角度来看,我们展示了rdd使应用程序能够控制集群中最常见的瓶颈资源(网络和存储I/ o),从而使对这些资源表达具有特定系统特征的相同优化成为可能。gydF4y2Ba

表达观点gydF4y2Ba.为了研究rdd的表达能力,我们首先将rdd与基于MapReduce模型的rdd进行比较。第一个问题是MapReduce本身可以表达什么计算?尽管关于MapReduce的局限性有很多讨论,但令人惊讶的答案是MapReduce可以模拟任何分布式计算。gydF4y2Ba

要了解这一点,请注意,任何分布式计算都由执行本地计算并偶尔交换消息的节点组成。MapReduce提供了gydF4y2Ba地图gydF4y2Ba操作,该操作允许进行局部计算gydF4y2Ba减少gydF4y2Ba它允许所有人之间的交流。因此,任何分布式计算都可以通过将其工作分解为时间步骤,在每个时间步骤中运行映射来执行局部计算,并在每个步骤结束时使用reduce进行批处理和交换消息来进行模拟,这可能有些低效。一系列MapReduce步骤将捕获整个结果,如gydF4y2Ba图10gydF4y2Ba.最近的理论工作通过表明MapReduce可以模拟并行随机访问机模型中的许多计算而形式化了这种类型的仿真。gydF4y2Ba8gydF4y2Ba重复映射-减少也等价于大容量同步并行模型。gydF4y2Ba20.gydF4y2Ba

虽然这一行工作表明MapReduce可以模拟任意计算,但有两个问题会使模拟背后的“常量因素”很高。首先,MapReduce在跨时间步共享数据方面效率很低,因为它依赖于复制的外部存储系统来实现此目的。由于在每一步之后写出它的状态,我们的仿真系统可能因此变得更慢。其次,MapReduce步骤的延迟决定了我们的模拟与真实网络的匹配程度,大多数Map-Reduce实现都是为具有几分钟到几小时延迟的批处理环境设计的。gydF4y2Ba

rdd和Spark解决了这两个限制。在数据共享方面,rdd通过避免中间数据的复制使数据共享变得更快,并且可以很好地模拟内存中的跨时间“数据共享”,这可能发生在由长时间运行的进程组成的系统中。在延迟方面,Spark可以在延迟为100ms的大型集群上运行类似mapreduce的步骤;MapReduce模型本身并没有阻止这一点。虽然有些应用程序需要更细粒度的时间步和通信,但100ms的延迟足以实现许多数据密集型工作负载,在这些工作负载中,在通信步骤之前可以批处理的计算量很高。gydF4y2Ba

总而言之,rdd建立在Map-Reduce模拟任何分布式计算的能力之上,但使这种模拟显著提高了效率。它们的主要限制是由于每个通信步骤的同步而增加的延迟,但这种延迟通常不是一个因素。gydF4y2Ba

系统的角度gydF4y2Ba.独立于模拟方法来描述Spark的通用性,我们可以采用系统方法。什么是集群计算的瓶颈资源?rdd能有效地使用它们吗?尽管集群应用程序多种多样,但它们都受到底层硬件的相同属性的约束。当前的数据中心具有很高的存储层次结构,以类似的方式限制了大多数应用程序。例如,一个典型的Hadoop集群可能具有以下特征:gydF4y2Ba

本地存储gydF4y2Ba.每个节点拥有约50GB/s带宽的本地内存,以及10 ~ 20个本地硬盘,提供约1GB/s ~ 2GB/s的硬盘带宽;gydF4y2Ba

链接gydF4y2Ba.每个节点都有一个10Gbps (1.3GB/s)的链路,大约比其内存带宽少40倍,比其磁盘总带宽少2倍;而且gydF4y2Ba

架gydF4y2Ba.节点被组织到20到40台机器的机架中,每个机架提供40Gbps80Gbps带宽,或比机架内网络性能低2x5倍。gydF4y2Ba

考虑到这些属性,在许多应用程序中最重要的性能问题是数据和计算在网络中的位置。幸运的是,rdd提供了控制这种放置的设施;该接口允许应用程序将计算放在输入数据附近(通过一个用于输入源“首选位置”的API)gydF4y2Ba25gydF4y2Ba), rdd提供对数据分区和托管的控制(例如指定数据由给定键进行散列)。库(例如GraphX)因此可以实现在专门系统中使用的相同放置策略。gydF4y2Ba6gydF4y2Ba

除了网络和I/O带宽之外,最常见的瓶颈往往是CPU时间,特别是当数据位于内存中时。不过,在这种情况下,Spark可以在每个节点上运行专门系统中使用的相同算法和库。例如,它在Spark SQL中使用列存储和处理,在MLlib中使用本机BLAS库,等等。正如我们前面所讨论的,rdd明显增加成本的唯一领域是网络延迟,这是由于并行通信步骤上的同步。gydF4y2Ba

从系统的角度来看,最后一个观察结果是,由于容错能力,Spark可能比目前的一些专门系统产生额外的成本。例如,在Spark中,每个shuffle操作中的map任务将它们的输出保存到它们运行的机器上的本地文件中,因此reduce任务可以稍后重新获取它。此外,Spark在shuffle阶段实现了一个屏障,因此reduce任务直到所有映射完成才会启动。这避免了在以流水线的方式直接从映射“推送”记录到还原时故障恢复所需要的一些复杂性。尽管删除其中的一些功能会提高系统的速度,但Spark的表现通常具有竞争力。主要原因是一个类似于我们前面的论点:许多应用程序都受到I/O操作的约束(比如跨网络传输数据或从磁盘读取数据),而在这个操作之外,优化(比如流水线)只带来了很少的好处。我们在Spark中默认保持容错是“打开”的,以便于对应用程序进行推理。gydF4y2Ba

回到顶部gydF4y2Ba

正在进行的工作gydF4y2Ba

Apache Spark仍然是一个快速发展的项目,工业界和研究界都做出了贡献。自2013年6月以来,代码库的规模增长了6倍,大部分活动都在新的库中进行。还有200多个第三方软件包可用。gydF4y2BacgydF4y2Ba在研究社区中,伯克利、麻省理工和斯坦福的多个项目都基于Spark,许多新的库(如GraphX和Spark Streaming)来自研究小组。在这里,我们概述了其中的四个主要努力。gydF4y2Ba

数据框架和更多声明性apigydF4y2Ba.核心Spark API基于分布式集合上的函数式编程,分布式集合包含任意类型的Scala、Java或Python对象。虽然这种方法表达能力很强,但它也使程序更难自动分析和优化。存储在rdd中的Scala/Java/Python对象可能具有复杂的结构,在这些对象上运行的函数可能包含任意代码。在许多应用程序中,如果没有使用正确的运算符,开发人员可能会获得次优性能;例如,系统本身不能进行推送gydF4y2Ba过滤器gydF4y2Ba函数先于地图。gydF4y2Ba

为了解决这个问题,我们在2015年扩展了Spark,添加了一个更具有声明性的API DataFramesgydF4y2Ba2gydF4y2Ba基于关系代数。数据帧是Python和r中用于表格数据的通用API。数据帧是一组具有已知模式的记录,本质上等同于数据库表,它支持使用受限制的“表达式”API进行过滤和聚合等操作。然而,与SQL语言不同的是,数据帧操作是在更通用的编程语言(如Python和R)中作为函数调用调用的,这允许开发人员使用宿主语言中的抽象(如函数和类)轻松地构建他们的程序。gydF4y2Ba图11gydF4y2Ba而且gydF4y2Ba图12gydF4y2Ba展示API的示例。gydF4y2Ba

Spark的DataFrames为单节点包提供了类似的API,但使用Spark SQL的查询计划器自动并行化和优化计算。用户代码因此得到了Spark函数API中无法提供的优化(例如谓词下推、操作符重排序和连接算法选择)。据我们所知,Spark DataFrames是第一个在数据框架API下执行这种关系优化的库。gydF4y2BadgydF4y2Ba

虽然数据框架还是新事物,但它们已经迅速成为流行的API。在我们2015年7月的调查中,60%的受访者表示使用它们。由于数据框架的成功,我们还开发了一种类型安全的接口,称为数据集gydF4y2BaegydF4y2Ba它允许Java和Scala程序员将dataframe视为Java对象的静态类型集合,类似于RDD API,并且仍然接受关系优化。我们希望这些api能够逐渐成为在Spark库之间传递数据的标准抽象。gydF4y2Ba

性能优化gydF4y2Ba.Spark中最近的大部分工作都是关于性能的。2014年,Databricks团队花了相当大的努力来优化Spark的网络和I/O原语,使Spark共同创造了Daytona GraySort挑战的新纪录。gydF4y2BafgydF4y2BaSpark对100TB数据的排序速度比之前基于Hadoop MapReduce的记录保持者快3倍,使用的机器数量减少了10倍。这个基准测试不是在内存中执行的,而是在(固态)磁盘上执行的。2015年的一项主要工作是“钨计划”,gydF4y2BaggydF4y2Ba它通过使用代码生成和非垃圾回收的内存,从Spark的许多代码路径中消除了Java虚拟机开销。在通用引擎中进行这些优化的一个好处是,它们会同时影响Spark的所有库;机器学习、流媒体和SQL都因为每次更改而变得更快。gydF4y2Ba

R语言支持gydF4y2Ba.SparkR项目gydF4y2Ba21gydF4y2Ba在2015年并入Spark,在R中提供一个编程接口。R接口基于DataFrames,使用与R内置数据帧几乎相同的语法。其他Spark库(如MLlib)也很容易从R调用,因为它们接受DataFrames作为输入。gydF4y2Ba

研究图书馆gydF4y2Ba.Apache Spark继续被用于构建更高级别的数据处理库。最近的项目包括用于神经科学的Thunder,gydF4y2Ba5gydF4y2Ba亚当对基因组学,gydF4y2Ba15gydF4y2Ba以及用于天文图像处理的Kira。gydF4y2Ba27gydF4y2Ba其他研究库(如GraphX)已经合并到主代码库中。gydF4y2Ba

回到顶部gydF4y2Ba

结论gydF4y2Ba

可扩展的数据处理将是下一代计算机应用程序的关键,但通常涉及不同计算系统的复杂处理步骤序列。为了简化这一任务,Spark项目为大数据应用程序引入了统一的编程模型和引擎。我们的经验表明,这样的模型可以有效地支持当前的工作负载,并为用户带来实质性的好处。我们希望Apache Spark能突出大数据编程库中可组合性的重要性,并鼓励开发更容易互操作的库。gydF4y2Ba

本文中描述的所有Apache Spark库都是开源的gydF4y2Bahttp://spark.apache.org/gydF4y2Ba.Databricks还免费制作了Spark峰会所有会议的视频gydF4y2Bahttps://spark-summit.org/gydF4y2Ba.gydF4y2Ba

回到顶部gydF4y2Ba

致谢gydF4y2Ba

Apache Spark是数百名开源贡献者的工作成果,他们在发布说明中被记录在gydF4y2Bahttps://spark.apache.orggydF4y2Ba.伯克利对Spark的研究部分得到了国家科学基金会CISE探索奖CCF-1139158、劳伦斯伯克利国家实验室奖7076018和DARPA XData奖FA8750-12-2-0331的支持,以及来自亚马逊网络服务、谷歌、SAP、IBM、托马斯和斯泰西·西贝尔基金会、Adobe、苹果、Arimo、Blue Goji、博世、C3Energy、思科、Cray、Cloudera、EMC2、爱立信、Facebook、Guavus、华为、Informatica、英特尔、微软、NetApp、Pivotal、三星、斯伦贝谢、Splunk、Virdata, VMware。gydF4y2Ba

回到顶部gydF4y2Ba

参考文献gydF4y2Ba

1.Apache风暴项目;gydF4y2Bahttp://storm.apache.orggydF4y2Ba

2.阿姆布鲁斯特等人。Spark SQL:用Spark处理关系数据。在gydF4y2BaACM SIGMOD/PODS会议论文集gydF4y2Ba(澳大利亚墨尔本,5月31日- 6月4日). ACM出版社,纽约,2015。gydF4y2Ba

3.Dave, A. Indexedrdd项目;gydF4y2Bahttp://github.com/amplab/spark-indexedrddgydF4y2Ba

4.Dean, J.和Ghemawat, S. MapReduce:大型集群的简化数据处理。在gydF4y2Ba第六届OSDI操作系统设计与实现研讨会论文集gydF4y2Ba(加州旧金山,12月68日)。USENIX协会,伯克利,加州,2004年。gydF4y2Ba

5.弗里曼,J.,弗拉基米洛夫,川岛,T.,穆,Y.,新泽西州索夫罗涅夫,班尼特,d.v.,罗森,J.,杨,c . T。loger, l.l.和Ahrens, M.B.用集群计算在规模上绘制大脑活动。gydF4y2Ba自然方法11gydF4y2Ba, 9(2014年9月),941950。gydF4y2Ba

6.冈萨雷斯,J.E.等人。GraphX:分布式数据流框架中的图形处理。在gydF4y2Ba十一届会议记录gydF4y2BathgydF4y2BaOSDI操作系统设计与实现研讨会gydF4y2Ba(布鲁姆菲尔德,CO, 10月68日)。USENIX协会,伯克利,加州,2014年。gydF4y2Ba

7.Isard, M.等人。Dryad:基于顺序构建块的分布式数据并行程序。在gydF4y2BaEuroSys会议论文集gydF4y2Ba(葡萄牙里斯本,2123年3月)。ACM出版社,纽约,2007年。gydF4y2Ba

8.Karloff, H., Suri, S.和Vassilvitskii, S. MapReduce的计算模型。在gydF4y2BaACM-SIAM SODA离散算法研讨会论文集gydF4y2Ba(奥斯汀,德克萨斯州,1719年1月)。ACM出版社,纽约,2010。gydF4y2Ba

9.Kornacker, M.等。Impala:一个现代的、开源的Hadoop SQL引擎。在gydF4y2Ba第七届双年CIDR创新数据系统研究会议论文集gydF4y2Ba(加州阿西洛玛,2015年1月47日)。gydF4y2Ba

10.Low, y等。分布式GraphLab:在云端进行机器学习和数据挖掘的框架。在gydF4y2Ba38人会议记录gydF4y2BathgydF4y2Ba超大数据库国际VLDB会议gydF4y2Ba(2012年8月2731日,土耳其伊斯坦布尔)。gydF4y2Ba

11.Malewicz, G.等人。预凝胶:用于大规模图形处理的系统。在gydF4y2BaACM SIGMOD/PODS会议论文集gydF4y2Ba(印第安纳波利斯,611年6月)。ACM出版社,纽约,2010。gydF4y2Ba

12.McSherry, F., Isard, M.和Murray, D.G.可扩展性!但代价是什么呢?在gydF4y2Ba15国会议记录gydF4y2BathgydF4y2BaHotOS关于操作系统热点话题的研讨会gydF4y2Ba(1820年5月,瑞士Kartause Ittingen)。USENIX协会,伯克利,加州,2015。gydF4y2Ba

13.Melnik, S.等人。Dremel: Webscale数据集的交互式分析。gydF4y2BaVLDB基金会议录gydF4y2Ba(2010年9月),330339年。gydF4y2Ba

14.孟,X., Bradley, J.K., Yavuz, B., Sparks, E.R, Venkataraman, S., Liu, D., Freeman, J., Tsai, d.b., Amde, M., Owen, S., Xin, D., Xin, R., Franklin, M.J, Zadeh, R., Zaharia, M.,和Talwalkar, A. MLlib: Apache Spark中的机器学习。gydF4y2Ba机器学习研究杂志gydF4y2Ba, 34(2016), 17。gydF4y2Ba

15.Nothaft, F.A, Massie, M., Danford, T., Zhang, Z., Laserson, U., Yeksigian, C., Kottalam, J., Ahuja, A., Hammerbacher, J., Linderman, M., Franklin, m.j., Joseph, ad,和Patterson, D.A.。在gydF4y2BaSIGMOD/PODS会议论文集gydF4y2Ba(澳大利亚墨尔本,5月31日,6月4日). ACM出版社,纽约,2015年。gydF4y2Ba

16.Shun J.和Blelloch, G.E. Ligra:用于共享内存的轻量级图处理框架。在gydF4y2Ba第18届ACM SIGPLAN PPoPP并行编程原理与实践研讨会论文集gydF4y2Ba(中国深圳,2月2327日)。ACM出版社,纽约,2013年。gydF4y2Ba

17.Sparks, e.r., Talwalkar, A., Smith, V., Kottalam, J., Pan, X., Gonzalez, J.E, Franklin, m.j., Jordan, m.i.,和Kraska, T. MLI:分布式机器学习的API。在gydF4y2BaIEEE ICDM数据挖掘国际会议论文集gydF4y2Ba(得克萨斯州达拉斯,710年12月)。IEEE出版社,2013年。gydF4y2Ba

18.斯通布雷克(Stonebraker)和西汀特梅尔(Cetintemel)。“一刀切”:一个时代来了又去的想法。在gydF4y2Ba第21届国际ICDE数据工程会议论文集gydF4y2Ba(4月58日,日本东京)。IEEE计算机学会,华盛顿特区,2005,211。gydF4y2Ba

19.Thomas, K., Grier, C., Ma, J., Paxson, V.和Song, D.一个实时URL垃圾邮件过滤服务的设计和评估。在gydF4y2BaIEEE安全与隐私研讨会论文集gydF4y2Ba(加州奥克兰,2225年5月)。IEEE出版社,2011年。gydF4y2Ba

20.并行计算的桥接模型。gydF4y2BaCommun。ACM 33gydF4y2Ba(1990年8月),103111。gydF4y2Ba

21.Venkataraman, S.等人。SparkR;gydF4y2Bahttp://dl.acm.org/citation.cfm?id=2903740&CFID=687410325&CFTOKEN=83630888gydF4y2Ba

22.Xin, R.和Zaharia, M.运行大规模Spark工作负载的经验教训;gydF4y2Bahttp://tinyurl.com/large-scale-sparkgydF4y2Ba

23.辛,r.s.,罗森,J.,扎哈里亚,M.,富兰克林,M.J.,申克,S.,和斯多伊卡。鲨鱼:大规模的SQL和丰富的分析。在gydF4y2BaACM SIGMOD/PODS会议论文集gydF4y2Ba(2227年6月,纽约)。ACM出版社,纽约,2013年。gydF4y2Ba

24.Zaharia, M。gydF4y2Ba大型集群上的快速通用数据处理体系结构gydF4y2Ba.2014年加州大学伯克利分校电子工程与计算机科学系博士学位论文;gydF4y2Bahttps://www.eecs.berkeley.edu/Pubs/TechRpts/2014/EECS-2014-12.pdfgydF4y2Ba

25.Zaharia, M.等。弹性分布式数据集:内存集群计算的容错抽象。在gydF4y2Ba第九届USENIX NSDI网络系统设计与实现研讨会论文集gydF4y2Ba(圣何塞,加利福尼亚州,2012年4月2527日)。gydF4y2Ba

26.Zaharia, M.等。离散流:大规模容错流计算。在gydF4y2Ba二十四人会议记录gydF4y2BathgydF4y2BaACM SOSP操作系统原理研讨会gydF4y2Ba(宾夕法尼亚州法明顿,11月36日)。ACM出版社,纽约,2013年。gydF4y2Ba

27.Zhang, Z., Barbary, K., Nothaft, N.A., Sparks, E., Zahn, O., Franklin, m.j., Patterson, D.A.和Perlmutter, S.科学计算遇到大数据技术:一个天文学用例。在gydF4y2BaIEEE大数据国际会议论文集gydF4y2Ba(加州圣克拉拉,10月29日1)。IEEE 2015。gydF4y2Ba

回到顶部gydF4y2Ba

作者gydF4y2Ba

马泰ZahariagydF4y2Ba(gydF4y2Bamatei@cs.stanford.edugydF4y2Ba)是加州斯坦福大学计算机科学助理教授,也是加州旧金山Databricks公司的CTO。gydF4y2Ba

雷诺美国新gydF4y2Ba(gydF4y2Barxin@databricks.comgydF4y2Ba)是加州旧金山Databricks Spark团队的首席架构师。gydF4y2Ba

帕特里克·温德尔gydF4y2Ba(gydF4y2Bapatrick@databricks.comgydF4y2Ba)是加州旧金山Databricks公司的工程副总裁。gydF4y2Ba

如来佛DasgydF4y2Ba(gydF4y2Batdas@databricks.comgydF4y2Ba)是加州旧金山Databricks公司的软件工程师。gydF4y2Ba

迈克尔时常要gydF4y2Ba(gydF4y2Bamichael@databricks.comgydF4y2Ba)是加州旧金山Databricks公司的软件工程师。gydF4y2Ba

Ankur戴夫gydF4y2Ba(gydF4y2Baankurd@eecs.berkeley.edugydF4y2Ba)是加州大学伯克利分校实时、智能和安全系统实验室的一名研究生。gydF4y2Ba

Xiangrui孟gydF4y2Ba(gydF4y2Bameng@databricks.comgydF4y2Ba)是加州旧金山Databricks公司的软件工程师。gydF4y2Ba

乔什·罗森gydF4y2Ba(gydF4y2Bajosh@databricks.comgydF4y2Ba)是加州旧金山Databricks公司的软件工程师。gydF4y2Ba

Shivaram VenkataramangydF4y2Ba(gydF4y2Bashivaram@cs.berkeley.edugydF4y2Ba)是加州大学伯克利分校AMPLab的博士生。gydF4y2Ba

迈克尔·富兰克林gydF4y2Ba(gydF4y2Bamjfranklin@uchicago.edugydF4y2Ba)是芝加哥大学计算机科学Liew家族主席和加州大学伯克利分校AMPLab主任。gydF4y2Ba

阿里GhodsigydF4y2Ba(gydF4y2Baali@databricks.comgydF4y2Ba)是Databricks的首席执行官,也是加州大学伯克利分校的兼职教员。gydF4y2Ba

约瑟夫·e·冈萨雷斯gydF4y2Ba(gydF4y2Bajegonzal@cs.berkeley.edugydF4y2Ba)是加州大学伯克利分校EECS系的助理教授。gydF4y2Ba

斯科特ShenkergydF4y2Ba(gydF4y2Bashenker@icsi.berkeley.edugydF4y2Ba)是加州大学伯克利分校的一名教授。gydF4y2Ba

离子斯托伊卡gydF4y2Ba(gydF4y2Bashenker@icsi.berkeley.edugydF4y2Ba)是美国加州大学伯克利分校EECS的教授和AMPLab的联合主任。gydF4y2Ba

回到顶部gydF4y2Ba

脚注gydF4y2Ba

a.传递给Spark的闭包可以调用任何现有的Scala或Python库,甚至可以引用外部程序中的变量。Spark将这些变量的只读副本发送到工作节点。gydF4y2Ba

b.其他设计优于Spark的一个领域是某些图形计算。gydF4y2Ba12gydF4y2Ba,gydF4y2Ba16gydF4y2Ba然而,这些结果是针对计算与通信的比率较低的算法(如PageRank)的,因为在Spark中同步通信的延迟很明显。在计算量较大的应用程序中(比如ALS算法),在Spark上发布应用程序仍然有帮助。gydF4y2Ba

c.一个包索引可在gydF4y2Bahttps://spark-packages.org/gydF4y2Ba

d.优化是可能的一个原因是Spark的DataFrame API使用延迟计算,即DataFrame的内容直到用户要求写出来才会被计算出来。R和Python中的数据帧api是迫切的,阻止了像操作符重排序这样的优化。gydF4y2Ba

e。gydF4y2Bahttps://databricks.com/blog/2016/01/04/introducing-spark-datasets.htmlgydF4y2Ba

f。gydF4y2Bahttp://sortbenchmark.org/ApacheSpark2014.pdfgydF4y2Ba

g。gydF4y2Bahttps://databricks.com/blog/2015/04/28/gydF4y2Ba

回到顶部gydF4y2Ba

数据gydF4y2Ba

F1图1。Apache Spark软件栈,在核心引擎上实现了专门的处理库。gydF4y2Ba

F2图2。我们示例中的第三个查询的沿袭图;方框表示rdd,箭头表示转换。gydF4y2Ba

F3图3。Spark中通过批处理梯度下降实现逻辑回归的Scala实现。gydF4y2Ba

F4图4。在50米2.4 ×大EC2节点上100GB数据的Hadoop MapReduce与Spark的逻辑回归性能。gydF4y2Ba

F5图5。在Spark中结合SQL、机器学习和流库的示例。gydF4y2Ba

F6图6。将Spark的性能与SQL、流和机器学习等几个广泛使用的专门系统进行比较。数据来自ZahariagydF4y2Ba24gydF4y2Ba(SQL查询和流式单词计数)和Sparks等。gydF4y2Ba17gydF4y2Ba(交替最小二乘矩阵分解)。gydF4y2Ba

F7图7。PanTera,一个建立在Spark上的可视化应用程序,可以交互过滤数据。gydF4y2Ba

F8图8。用Spark创建的斑马鱼大脑神经元的可视化,每个神经元根据与其活动相关的运动方向被着色。资料来源:杰里米·弗里曼和米沙·阿伦斯的詹尼利亚研究校园。gydF4y2Ba

F9图9。根据Databricks 2015年Spark调查,使用各个Spark组件的组织百分比;https://databricks.com/blog/2015/09/24/。gydF4y2Ba

F10图10。用MapReduce模拟任意分布式计算。gydF4y2Ba

季图11。Spark的Python DataFrame API示例。与Spark的核心API不同,DataFrames有一个带有命名列(如年龄和城市)的模式,并采用有限的语言(如年龄> 20)而不是任意的Python函数表示表达式。gydF4y2Ba

F12图12。在Spark的R API中使用数据帧。我们使用Spark的JSON数据源加载分布式DataFrame,然后使用标准的R列表达式进行筛选和聚合。gydF4y2Ba

UF1数字使用Spark对斑马鱼幼虫的大脑活动进行分析:(左)矩阵分解来描述功能相似的区域(用不同的颜色表示),(右)将整个大脑活动的动态嵌入到低维轨迹中。来源:杰里米·弗里曼和米沙·阿伦斯,弗吉尼亚州阿什本霍华德·休斯医学研究所詹尼利亚研究校园。gydF4y2Ba

UF2数字观看作者在此独家讨论他们的工作gydF4y2Ba通信gydF4y2Ba视频。//www.eqigeno.com/videos/sparkgydF4y2Ba

回到顶部gydF4y2Ba


版权归作者所有。授权ACM出版权利。gydF4y2Ba

数字图书馆是由计算机协会出版的。版权所有©2016 ACM, Inc.gydF4y2Ba


没有发现记录gydF4y2Ba

Baidu
map