Apache Spark
Apache Spark是一个开源的分布式通用集群计算框架,具有(大部分在内存)内存数据处理引擎,可以对大量静态数据进行ETL,分析,机器学习和图形处理(批处理)或动态(流处理),并且有许多用于编程语言的丰富简洁的高级API:Scala,Python,Java,R和SQL。

也可以将Spark描述为具有SQL查询,图形处理和机器学习的批量和流式传输模式的分布式数据处理引擎。
与Hadoop的基于磁盘的两阶段的MapReduce计算引擎相反,Spark的多阶段(大多数)内存计算引擎允许在内存中运行大多数计算,因此大多数情况下可以为某些应用程序提供更好的性能,例如迭代算法或交互式数据挖掘(可以参阅Spark officially sets a new record in large-scale sorting).
Spark旨在提高速度,易用性,可扩展性和交互式分析。
Spark通常被称为集群计算引擎或简称执行引擎。
Spark是用于执行复杂多阶段应用程序的分布式平台,如机器学习算法和交互式即时查询。Spark为弹性分布式数据集(Resilient Distributed Dataset)的内存式集群计算提供了有效的抽象。
使用Spark应用程序框架,简化了对机器学习和预测分析的访问。
Spark主要用Scala编写,但为Java,Python和R等语言提供API。
| Note | Microsoft的Mobius project为Spark提供了C#API(可以在.NET框架中支持的语言(如C#或F#)中实现Spark驱动程序和数据处理操作。) |
|---|---|
如果您有大量数据却需要典型的MapReduce程序无法提供的低延迟处理,那么Spark是一种可行的替代方案。
访问任何数据源中的任何数据类型。
对存储和数据处理的巨大需求。
Apache Spark项目是构建在Spark Core上的SQL(带有数据集),streaming,machine learning(管道)和graph图计算的容器。您可以使用相同的API在一个应用程序中运行它们。
Spark可以在本地运行,集群,内部部署或云端运行。它运行在Hadoop YARN,Apache Mesos,独立或云端(Amazon EC2或IBM Bluemix)之上。
Spark可以从许多数据源访问数据。
用MLlib和GraphX的Apache Spark的Streaming和SQL编程模型使开发人员和数据科学家更容易构建利用机器学习和图形分析的应用程序。
具体来说就是,Spark应用程序用一些输入创建一些RDD,然后这些RDD进行(lazy) transformations转换其它格式的RDD,最后执行的actions以收集或存储数据。并不复杂,对吧?
您可以从程序员,数据工程师和运维人员的角度来看Spark。说实话,所有这三种人都会花费很多时在Spark才能达到可以利用所有可用功能的地步。程序员使用语言特定的API(并在RDD级别使用 transformation 和 action),数据工程师使用更高级的抽象,如DataFrames或Pipelines API或外部工具(连接Spark),最后是运维人员设置好Spark群集来部署Spark应用程序。
作为一个通用的计算平台,Spark的目标是成为在单个统一引擎之上建立各种专用应用的程序框架。
| Note | 当您听到“Apache Spark”这个名词时,有两种可能,一是指 Spark引擎 Spark Core 或者是指Apache Spark开放源代码项目,它是一个涵盖性术语,包含其他的基于Spark Core的Spark应用程序框架,如Spark SQL,Spark Streaming,Spark MLlib和Spark GraphX,Spark中的主要数据抽象称为RDD - 弹性分布式数据集。 |
|---|---|
为什么选择Spark
我们先列出Spark的其中几个优点,然后再来一个更有技术帮助的概述。
容易上手
Spark 提供spark-shell使笔记本电脑上的命令行上编写和运行Spark应用程序非常容易。
然后,您可以使用Spark Standalone内置集群管理器将Spark应用程序部署到生产级集群,以在完整数据集上运行。
可用于多种工作负载的统一引擎
正如Introduction to AmpLab Spark Internals video中 Matei Zaharia (Apache Spark的创始人)所言(稍微改动):
Spark项目的目标之一是提供一个支持各种各样工作流程的平台,不仅是MapReduce 批处理作业(Hadoop当时已经可用),还有图形算法或机器学习等迭代计算。
而且适用亚秒级交互式作业到运行上小时的作业的不同规模的负载。
Spark用一个丰富的简明API下集成了 批处理,交互式和流计算 等工作负载。
Spark 通过Spark Streaming应用程序框架支持近实时流工作负载。
ETL的工作负载和分析任务的工作负载存在差异,但是Spark试图为各种工作负载提供统一的平台。
图形和机器学习算法本质上是迭代的,较少的磁盘保存或网络传输意味着更好的性能。
还支持使用Spark shell的交互式工作负载。
你应该看这个视频What is Apache Spark?,是由Cloudera的首席战略官兼联合创始人Mike Olson,对Apache Spark的非常特别的概述,以及Spark其在开源社区的普及和如何将MapReduce替代成为Hadoop中的通用处理引擎。
充分利用分布式批处理数据处理
当您想到分布式批处理数据处理时,Hadoop自然会被视为可行的解决方案。 Spark从Hadoop MapReduce中吸取了许多想法。它们一起运行很融洽 - Spark on YARN和HDFS - 同时提高分布式计算引擎的性能和简单性。 对于大多数情况,Spark是Hadoop++,即以更好的方式完成MapReduce。 不用感到惊讶,没有的Hadoop MapReduce的(它的优点和不足之处),Spark根本不会诞生。
RDD - 分布式并行Scala集合
作为Scala开发人员,您可能会发现Spark的RDD API与Scala的Collections API非常相似(如果不是一模一样)。 它也暴露了Java,Python和R接口(以及SQL,即SparkSQL,在某种意义上)。 所以,当您需要用到Scala中的分布式集合API时,Spark与RDD API应该是一个有力的竞争者。
丰富的标准库
您不仅可以使用有map和reduce(类似Hadoop中的MapReduce作业)的Spark,也有其它许多更高级别的操作,以减轻你的Spark查询和应用程序的开发工作。
它扩展了可用的计算方式,超越Hadoop MapReduce中可用的唯一的map-and-reduce。
统一的开发和部署环境
不管您使用哪种Spark工具 - 支持的许多编程语言的Spark API(Scala,Java,Python,R或Spark shell),还是利用RDD概念的许多Spark应用程序框架,即Spark SQL,Spark Streaming,Spark MLlib和Spark GraphX,结构化数据查询(Spark SQL)还是只是大型分布式批处理(Spark Core) 或流式计算(Spark Streaming) 。
Spark的效率也非常高,团队可以利用团队成员迄今为止获得的不同技能。数据分析师,数据科学家,Python程序员或Java或Scala或R都可以使用相同的Spark平台,使用量身定做的API。它使得技术人员将不同编程语言的专业知识与Spark项目结合在一起。
互动探索/探索性分析
也被称为临时查询 。
使用Spark shell,您可以执行计算处理大量数据(The Big Data)。 在最终生产发布之前,探索数据是全部互动的,非常有用。
另外,使用Spark shell可以访问任何Spark集群 ,就像它是本地机器一样。 只需将Spark shell指向10TB RAM内存的20个节点(使用--master ),并使用Spark SQL,Spark MLlib,Spark Streaming和Spark GraphX等所有组件(及其抽象)。
根据您的需求和技能,您可能会更好地挑选SQL与编程API或应用机器学习算法(Spark MLlib)处理图形数据结构(Spark GraphX)中的数据。
统一的环境
无论您使用哪种编程语言,无论是Scala,Java,Python,R还是SQL,您都可以使用相同的群集运行时环境进行原型设计,即席查询并利用Spark平台提供的许多数据采集点并部署您的应用程序。
您可以直接使用低级别的RDD API或使用的更高级API,如Spark SQL(Datasets),Spark MLlib(ML Pipelines),Spark GraphX(Graphs)或Spark Streaming(DStreams)。
或者在单个应用程序中使用同时使用。
适应不同类型工作负载的单一编程模型和执行引擎简化了开发和部署架构。
支持多种数据源的数据集成工具包,
Spark可以从许多类型的数据源(关系,NoSQL,文件系统等)中读取 - 使用许多类型的数据格式 - Parquet,Avro,CSV,JSON。
输入和输出数据源都允许程序员和数据工程师使用Spark作为平台,使用读取的或保存的大量数据进行交互式(使用Spark shell)或用应用程序进行处理。
不能用的工具现在都可以用
像建议选择正确的工具一样,不是什么都是可行的。 时间,个人喜好,你所处理的操作系统都是决定当时什么是正确的选择的因素(使用锤子可以是一个合理的选择)。
Spark在一个统一的开发和运行时环境中包含了许多概念。
现在Scala开发人员可以使用Python的工具和功能丰富的机器学习(作为Spark MLlib中的Pipeline API或调用
pipe()),例如SciKit库。R的DataFrames可在Scala,Java,Python,R API中使用。
机器学习算法中的单节点算法被迁移到Spark MLlib中的分布式算法版本。
这一个平台为Python,Scala,Java和R程序员以及数据工程师(SparkR)和科学家(在Spark SQL中使用Thrift JDBC/ODBC Server)的专有企业数据仓库)提供了大量机会。
记住谚语, 如果你只有一个锤子,那什么东西看起来都像钉子 。
底层优化
Apache Spark使用计算阶段的有向无环图 (DAG) (也称为执行DAG )。 它推迟任何处理,直到真正需要的action。 Spark的懒惰评估提供了很多机会来进行底层优化(so users have to know less to do more)。
有句话叫少即是多 。
在低延迟迭代工作负载下的Excel
Spark支持多种工作负载,但针对低延迟迭代的工作负载比较优秀。 它们经常用于机器学习和图形算法。
许多机器学习算法在结果模型获得最优之前需要大量的迭代,如逻辑回归。 同样适用于在需要时遍历所有节点和边缘的图算法。 当临时部分结果存储在存储器中或非常快速的固态驱动器时,这种计算可以提高其性能。
Spark可以缓存内存中的中间数据,以加快建模和培训 。 一旦将数据加载到内存(作为初始步骤),重复使用多次就不会导致性能下降。
此外,图算法可以遍历图,每次迭代一次连接,部分结果在内存中。
当您需要处理大量数据时,较少的磁盘访问和网络可能会产生巨大的差异,尤其当它数据量很大的时候。
ETL更简单
Spark提供了Extract,Transform和Load(ETL) ,支持许多编程语言,Scala,Java,Python(不太可能R)。 您可以全部使用它们,或选择最适合的。
特别是Spark中的Scala样板代码相当简洁(与Java中的MapReduce等其他语言和方法相比)。
统一简明的高级API
Spark为批量分析(RDD API),SQL查询(Dataset API),实时分析(DStream API),机器学习(ML Pipeline API)和图形处理(Graph API)提供统一,简洁,高级的 API。
开发人员不再需要学习许多不同的处理引擎和平台,并且花费时间来掌握每个用例框架API(在同一个Spark计算引擎中就可以)。
使用统一API的处理不同种类的数据
Spark通过统一的API和数据结构对批处理 , 交互式和流处理的三种数据进行处理。
很少甚至不用磁盘所以有更好的性能
在不久之前,当最流行的分布式计算框架是Hadoop MapReduce时 ,只有在将其写入Hadoop分布式文件系统(HDFS)之类的外部存储器后,才可以重用计算后数据(就算只用部分数据)。 它会花费大量的时间来计算非常基本的多阶段计算。 它只受到IO(或是网络)的开销。
构建Spark的许多动机之一是为了拥有一个良好的数据重用框架。
Spark通过一种方式在内存中保留尽可能多的数据,并将其保留在工作完成之前。 工作中有多少阶段属于无关紧要。 重要的是可用的内存量,以及使用Spark API的效率(所以没有发生 shuffle )。
Spark致力于最小化网络和磁盘IO,更好的性能
包含容错
在Spark中,故障不被认为是一种特殊情况,而是作为并行和分布式系统的正常情况。 Spark默认情况下会处理故障并从处理故障中恢复,而不需要特别复杂的逻辑来处理它们。
小代码库邀请开发人员
Spark的设计相当简单,与其提供的功能相比,其代码量并不大。
Spark的小代码库邀请项目开发人员 - 那些可以扩展平台并以更稳定的速度修复错误的程序员。