“戏”说Spark---Spark架构

前言
在Spark初认识中,我们了解到了,Spark是一个一栈式的大数据处理生态系统,其核心的组件Spark Core,Spark Sql,SparkStreaming分别解决了大数据中的数据处理的批处理,交互式查询,实时查询的业务场景。Spark的核心是Spark core,其他的组件都是基于Spark Core的,那么,问题来了。
问题:
Spark的核心模块是Spark Core,那么Spark Core到底是怎么样的一个优秀架构才能撑起整个“大而全且优”的Spark生态的呢?其他的组件又是以怎么样的方式基于Spark Core解决相应的业务问题的呢?
这些问题都需要慢慢的解答。
首先我们先从Spark的架构开始
Spark的官方架构图:
“戏”说Spark---Spark架构
架构图解释:
解释架构图之前,我们需要知道我们编写Spark应用程序和一般的应用程序没有太大的差别。它们都需要经历从编写到提交、执行、输出的整个过程,只不过Spark应用程序是分布式的,执行时是分布式执行的.。
在明白这个道理后,就可以方便我们理解架构中的一些概念:
应用程序(Application)--编写Spark分布式程序: 基于Spark的用户程序,就是我们编写的分布式的Spark程序,既然是分布式的程序,那么它分为两部分:
Driver功能的代码和分布在集群中多个节点上运行的Executor代码。
功能:
Driver部分主要是对SparkContext进行配置、初始化以及关闭。初始化SparkContext是为了构建Spark应用程序的运行环境,在初始化SparkContext,要先导入一些Spark的类和隐式转换;在Executor部分运行完毕后,需要将SparkContext关闭。
Spark应用程序的Executor部分是对数据的处理
Client--提交Spark应用程序:作为用户的客户端负责提交应用
驱动程序(Driver Program)---启动Spark应用程序:运行Application的main()函数,启动Spark应用程序并且创建SparkContext,通常用SparkContext代表Driver Program。
集群管理程序(ClusterManager)--分配执行Spark应用程序所需的资源:在集群上获取资源的外部服务,说白了就是为Spark集群提供计算资源的一些资源管理框架
目前有三种:
  1. Standalon (粗粒度): spark原生的资源管理,在Standalone模式中即为Master(主节点)由Master负责资源的分配,控制整个集群,监控Worker
  2. Apache Mesos(粗粒度+细粒度):与hadoop MR兼容性良好的一种资源调度框架,
  3. Hadoop Yarn(粗粒度): 主要是指Yarn中的ResourceManager
Worker(从节点)--负责控制执行:负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。
执行单元(Executor)--实际执行Spark应用程序的执行器: 是为某Application运行在Worker Node上的一个进程,就是执行程序的单元。该进程负责运行Task,并且负责将数据存在(cache)内存或者磁盘上,每个Application都有各自独立的Executors。
输出:将计算的结果存储在磁盘,内存或者hdfs中。或者Driver将结果回收回driver端
好了,有了Spark的架构后,我们编程人员怎么样来使用Spark呢,Spark提供了其编程接口。
Spark编程接口
Spark用Scala[5]语言实现了RDD的API。Scala是一种基于JVM的静态类型、函数式、面向对象的语言。
我们选择Scala是因为它简洁(特别适合交互式使用)、有效(因为是静态类型)。但是,RDD抽象并不局限于函数式语言,也可以使用其他语言来实现RDD,比如Java要使用Spark,开发者需要编写一个driver程序,连接到集群以运行Worker,如下图,Driver定义了一个或多个RDD,并调用RDD上的动作。Worker是长时间运行的进程,将RDD分区以Java对象的形式缓存在内存中。
“戏”说Spark---Spark架构
Spark的运行时。用户的driver程序将其Tasks发送到Worker端,用户的driver程序启动多个worker,worker从分布式文件系统中读取数据块,然后执行Tasks,并将计算后的RDD分区缓存在内存中或磁盘中,或者将计算的结果拉回到Driver端。
Spark架构采用的是分布式计算中的Master-Slave模型。Master作为整个集群的控制器,负责整个集群的正常运行;Worker是计算节点,接受主节点命令以及进行状态汇报;Executor负责任务(Tast)的调度和执行;Driver负责控制一个应用的执行。
注意:结合Spark集群的搭建和提交一个应用更能感受Spark的架构,关系Spark集群的搭建,请参考博客:“戏”说Spark的搭建和客户端的搭建
总结:
Spark架构采用的是分布式计算中的Master-Slave模型。我们编写的Spark应用程序是分布式执行的,Spark应用程序可分两部分:Driver部分初始化和负责控制一个应用的执行,Executor部分实际执行,通过Client提交Spark应用程序,在Driver Program启动,通过集群管理程序(ClusterManager)调用资源执行。
请记住上面的架构图,接下来的所有的知识都是基于架构图中的各个部分深入讲解的。
现在以思维导图的方式构建知识架构:
“戏”说Spark---Spark架构
参考:
Spark (二) 架构详解