Spark之YARN介绍
一、导语
Apache Spark(后续简称为Spark)是一款正在点燃大数据世界的开源集群计算框架。据Spark Certified Experts显示,在内存中运行时,Sparks性能要比Hadoop快一百倍,在磁盘上运行,Sparks比Hadoop快达十倍。在本篇博客中,我将会为你简单介绍一下Spark的底层基础架构。
二、Spark及其特性
Spark是一款专门进行实时数据处理的开源的集群计算框架。内存集群计算(in-memory cluster computing)是Spark最主要的特性,它有效的提升了应用程序的处理速度。Spark提供了一个可对具备数据并行性和高容错的集群进行编程的接口。它旨在涵盖各种工作,例如批处理应用程序、迭代算法、交互查询和流式处理。
Spark的特性如图所示:
- Speed
在大规模数据处理方面,Spark运行要比Hadoop的MapReduce快一百倍。当然,它也可以通过控制分区(partitioning)来达到这个速度。 - Powerful Caching
Spark简单的编程层提供了强大的缓存和磁盘持久化功能。 - Deployment
Spark可以部署在多个平台:Mesos、Hadoop via YARN、Spark自己的集群管理器。 - Real-Time
得益于内存计算,Spark能够提供实时的计算和低延迟处理。 - Polyglot
Spark为Java、Scala、Python和R语言提供了高级API。我们可以使用上述四种语言任意之一来编写Spark代码。同时,在Scala和Python中,它也提供了一个shell。
三、Spark架构总览
Spark的架构分层定义的很明确,因此各个组件和层之间保持着松散的耦合。这个架构进一步集成了各种不同的扩展与依赖。Spark架构主要基于两个抽象层:
- Resilient Distributed Dataset(RDD)
- Directed Acyclic Graph(DAG)
在进一步深入了解Spark架构之前,让我来解释几个基础概念如Spark 生态系统和RDD,这些会帮助你有更深入的理解。
让我首先来解释一下什么是Spark 生态系统
Spark 生态系统
如下图所示,Spark生态系统是由各种各样的组件组成,例如Spark SQ L、Spark Streaming、MLlib、GraphX和Spark Core(核心API)。
- Spark Core
Spark Core是大规模并发和分布式数据处理的基础引擎。进一步讲,Core上层的附加依赖可以进行多种工作例如流式计算、SQL和机器学习(machine learning)。Core主要负责内存管理,故障恢复,协调、分配和监控一个集群上的任务以及和存储系统进行交互。 - Spark Streaming
Spark Streaming是Spark用于实时处理流式数据的模块。因此,它是核心Spark API很有用的附加。它支持高吞吐和高容错地进行流式处理实时的数据流。 - Spark SQL
Spark SQL是Spark中的一个新的模块,它将相关的处理和Spark的一些功能性的编程API集成在一起。它支持使用SQL或者HIVE查询语言来查询数据。对于熟悉关系型数据库的人来说,Spark SQL将会很容易过渡过来的工具,你可以在Spark SQL扩展传统关系数据处理的范围。 - GraphX
GraphX是用于图形和并行图形计算的Spark API,因此它使用一个弹性的分布式属性图形扩展了Spark RDD。在较高层次上看,GraphX通过引入弹性分布式属性图(具有附加到每个顶点和边属性的有向多图)来扩展Spark RDD抽象。 - MLlib(Machine Learning)
MLlib是一个机器学习的依赖库,常常被用于在Spark中执行机器学习。 - SparkR
它是一个R的包,主要用于提供一个分布式数据帧的实现,同时支持向选择、过滤和聚合等操作,不过要用于处理大数据集。
正如你所见,Spark附带了高级的依赖库,包括对R、SQL、Python、Scala、Java等的支持,这些标准库在复杂的工作流程中实现了无缝集成。除此以外,它还允许和各种服务集进行集成,例如MLlib、GraphX、SQL+数据框架、流服务等,以增强其功能。
现在让我们来讨论一下Spark基础的数据结构,即RDD。
Resilient Distributed Dataset(RDD)
RDDs 是Spark应用程序构建的基础block。RDDs 解释为:
- Resilient: 容错性与故障恢复
- Distributed: 分布在集群中多个节点的数据
- Dataset: 被分区的带有值的数据的集合
它是一个分布式集合之上的抽象数据层,本质上是不可变的并且遵循惰性转换(lazy transformations)。
现在你可能想知道它的工作原理。一个RDD中的数据通过key分成多个块。RDD是高度弹性的,由于相同的数据块可以跨多个executor node进行复制,所以他们能够迅速从这些故障中恢复。因此,即使一个executor node挂掉,其他的仍将继续处理这些数据。这就可以使你能够利用多个节点的威力来非常迅速的对数据集执行功能性的计算。
而且,RDD一旦被创建了,它就变得不可变,我所说的不可变是指一个对象,其状态在创建后是无法修改的,但可以进行转换。
提到分布式环境,RDD中的每个数据集都分成逻辑分区,可以在集群中的不同节点进行计算,因此,你可以并行地对完整的数据进行转换或操作。当然,你不必担心这个分布问题,Spark会处理好这些。
总共有两种方式来创建RDD——可以通过并行化驱动程序中存在的集合,或者通过引用外部系统(如共享文件系统、HDFS、Hbase等)中的数据集。
对于RDD,你可以执行两种方式的操作:
- Transformations: 用来创建新的RDD的操作
- Actions: 主要用来引导Spark来对RDD进行数据计算并且将结果返回给驱动
我希望你可以对RDD概念有透彻的理解,现在,我来更深入的看一下Spark架构的工作原理。
Spark架构的工作原理
你已经了解了Spark的基本架构,现在我们来深入了解一下它的工作原理。
在你的master node上面,你可以用一个驱动程序来使你的application运转。当你写代码时,你的代码就是驱动程序,或者当你在使用交互式终端时,这个终端就是驱动程序。
在驱动程序中,你首先要做的就是创建一个Spark上下文(Context),Spark Context类似于Spark所有功能的网关,正如你的数据连接似的,你可以通过数据库连接来执行你所有的数据库操作,同样,你也可以通过Spark Context来做一些对Spark的操作。
请勿转载