Apache Spark是一个集群计算设计的快速计算。它是建立在Hadoop MapReduce之上,它扩展了 MapReduce 模式,有效地使用更多类型的计算,其中包括交互式查询和流处理。这是一个简单的Spark教程,介绍了Spark核心编程的基础知识。
工业公司广泛的使用 Hadoop 来分析他们的数据集。其原因是,Hadoop框架是基于简单的编程模型(MapReduce),并且它使用的计算解决方案,是可扩展的,柔性的,容错和低成本。 在这里,主要关心的是在查询之间等待时间和等待时间来运行程序处理大型数据集的速度。
Spark由Apache软件基金会对于加快Hadoop计算软件的过程。
作为对一个共同的信念,Spark不是 Hadoop 的修改版本,不依赖于Hadoop,因为它有自己的集群管理。Hadoop仅仅是实现Spark的方式之一。
Spark使用Hadoop的方式有两种- 一种是存储和第二个是处理。由于Spark有自己的集群管理计算,所以一般它使用Hadoop只有存储的目的。
Apache Spark
Apache Spark是一个快速的集群计算技术,设计用于快速计算。它是基于Hadoop MapReduce和它扩展了MapReduce模型,以有效地将其用于多种类型的计算,其中包括交互式查询和流处理。Spark的主要特征是其内存集群计算,增加的应用程序的处理速度。
Spark旨在涵盖广泛的工作负载,如批量应用,迭代算法,交互式查询和分流。除了支持所有这些工作负载在各自的系统中,它减少了维护单独工具的管理负担。
Apache Spark的演变
Spark是在加州大学伯克利分校的AMPLab由马太·扎哈里亚在2009年开发的Hadoop子项目之一。它在2010年开源,在BSD许可下。它在2013年捐赠给Apache Software 基金,现在的Apache Spark已经在2014年2月成为Apache的顶级项目。
Apache Spark特色
Apache Spark有以下特点。
-
速度 − Spark有助于运行Hadoop集群应用,在存储器高达100倍更快的速度,以及10倍的速度在磁盘上运行时。这可以通过减少读/写操作数到磁盘。它存储在内存中的中间处理数据。
-
支持多语言 − Spark 提供了Java, Scala, Python的内置API。因此,可以使用不同语言来写应用程序。Spark 配备了80个高层次的操作符进行互动查询。
-
高级分析 − Spark不只支持“Map”和“reduce”。它还支持SQL查询,流数据,机器学习(ML),和图形的算法。
Spark在Hadoop上建立
下图显示了Spark 如何使用Hadoop组件的三种方式来构建。
有三种方法部署Spark ,如下面所解释。
-
单机版 − Spark独立部署是指Spark占据在HDFS之上(Hadoop分布式文件系统)并将空间分配给HDFS。在这里,Spark和MapReduce将并列覆盖所有Spark的作业集群。
-
Hadoop Yarn − Hadoop Yarn部署方式,简单地说,spark运行在Yarn没有任何必要预安装或使用root访问权限。它有助于Spark融入Hadoop生态系统和Hadoop堆栈。它允许在其它部件叠上层的顶部上运行。
-
Spark 在 MapReduce (SIMR) − Spark在MapReduce的用于启动spark作业,除了独立部署。通过SIMR,用户可以启动Spark和使用Shell,而不需要任何管理权限。
Spark组件
下图说明了Spark的不同组成部分。
Apache Spark 核心
Spark核心是底层一般执行引擎,所有其他的功能都是建立在Spark的平台之上。 它提供了内存计算和引用数据集在外部存储系统。
Spark SQL
星火SQL是引入了一种名为SchemaRDD一个新的数据抽象,它提供了结构化和半结构化数据的支持,它是Spark核心的组成部分。
Spark 数据流
Spark数据流充分利用Spark核心快速调度能力进行流分析。它摄取的数据在小型分批进行RDD(弹性分布式数据集),对这些小批量的数据转换。
MLlib (机器学习库)
MLlib是一个分布式的机器学习框架的分布式存储器为基础的Spark架构。它根据基准,由MLlib开发商对交替最小二乘(ALS)实现完成。Spark MLlib 9倍快于Hadoop基于磁盘的版本(前Mahout中获得了星火接口)Apache Mahout 。
GraphX
GraphX是Spark顶部上的分布式图形处理框架。它提供了用于表达图表计算,并可以通过使用预凝胶抽象API来建模用户定义的图形的API。它还提供了这种抽象的优化运行。
Apache Spark RDD
弹性分布式数据集
弹性分布式数据集(RDD)是Spark的基本数据结构。它是对象的不可变的分布式集合。在RDD中每个数据集被划分成逻辑分区,这可能是在群集中的不同节点上计算的。RDDS可以包含任何类型,如:Python,Java,或者Scala的对象,包括用户定义的类。
形式上,一个RDD是只读的,分割的记录集。RDDs 可以数据创建通过确定运算在稳定的存储或其他RDDs 。RDD是可以并行进行操作元素的容错集合。
有两种方法来创建RDDs − 并行现有集合中的驱动器程序,或在外部存储系统引用的数据集,如共享文件系统,HDFS,HBase,或任何数据源提供Hadoop的输入格式。
Spark利用RDD概念,以实现更快,更高效的MapReduce作业。让我们先讨论MapReduce如何操作,为什么不那么有效。
数据共享是缓慢的MapReduce
MapReduce被广泛用于处理和生成大型数据集并行,分布在集群上的算法。它允许用户编写并行计算,使用一组高层次的操作符,而不必担心工作分配和容错能力。
遗憾的是,目前大多数的框架,只有这样,才能重新使用计算(前 - 两个MapReduce工作之间)之间的数据是将其写入到一个稳定的外部存储系统(前- HDFS)。虽然这个框架提供了大量的抽象访问群集的计算资源,但用户还是想要更多。
这两个迭代和互动应用需要跨并行作业更快速的数据共享。数据共享MapReduce是缓慢的,因为复制,序列化和磁盘IO。在存储系统中,大多数的 Hadoop 应用,它们花费的时间的90%以上是用于做HDFS读 - 写操作。
MapReduce的迭代操作
重复使用多个计算中间结果在多级的应用程序。下图说明了如何在当前的框架工作,同时做迭代操作上的MapReduce。这会带来大量的开销,由于数据复制,磁盘I / O,和系列化,使系统变慢。
MapReduce的交互式操作
用户运行即席查询,数据的相同子集。每个查询会做稳定存储,它可以主宰应用程序执行的磁盘I/O时间。
下图说明了如何在当前的框架工作同时做交互查询在MapReduce上。
使用Spark RDD数据共享
数据共享MapReduce是缓慢的,因为复制,序列化和磁盘IO。大多数的Hadoop应用,他们花费的时间的90%以上是做HDFS读 - 写操作。
认识到这个问题,研究人员专门开发了一种称为Apache Spark框架。spark的核心思想是弹性分布式数据集(RDD); 它支持在内存中处理运算。这意味着,它存储存储器的状态作为两端作业的对象以及对象在那些作业之间是可共享的。在存储器数据共享比网络和磁盘快10到100倍。
现在让我们理解迭代和交互式操作是如何发生在Spark RDD中。
Spark RDD迭代操作
下面给出的图显示Spark RDD迭代操作。它将存储中间结果放在分布式存储器,而不是稳定的存储(磁盘)和使系统更快。
注 − 如果分布式存储器(RAM)足以存储中间结果(该作业状态),那么它将存储这些结果的磁盘上。
Spark RDD交互式操作
该图显示Spark RDD的交互式操作。如果不同查询在同一组数据的反复运行,该特定数据可被保存在内存中以获得更好的执行时间。
默认情况下,每个变换RDD可以在每次运行在其上的动作时间重新计算。但是,也可能会持续一个RDD在内存中,在这种情况下,Spark将保持周围群集上以获得非常快速访问,在你查询它的下一次用上。另外也用于在磁盘上持续RDDS支持,或在多个节点间复制。