首页技术文章正文

Spark集群的运行架构和基本原理

更新时间:2022-03-28 来源:黑马程序员 浏览量:

Spark集群的运行架构

Python开发人员经常使用Spark进行大规模数据处理和分析,Spark是基于内存计算的大数据并行计算框架,比MapReduce计算框架具有更高的实时性,同时具有高效容错性和可伸缩性,在学习Spark操作之前,首先介绍Spark运行架构,如图2-11所示。

Spark集群的运行架构

在上图中,Spark应用在集群上运行时,包括了多个独立的进程,这些进程之间通过驱动程序(Driver Program)中的SparkContext对象进行协调,SparkContext对象能够与多种集群资源管理器(Cluster Manager)通信,一旦与集群资源管理器连接,Spark会为该应用在各个集群节点上申请执行器(Executor), 用 于 执 行 计 算 任 务 和 存 储 数 据。Spark将应用程序代码发送给所申请到的执行器,SparkContext对象将分割出的任务(Task)发送给各个执行器去运行。

需要注意的是,每个Spark应用程序都有其对应的多个执行器进程。执行器进程在整北京市昌平区建材城西路金燕龙办公楼一层电话:400-618-400015个应用程序生命周期内,都保持运行状态,并以多线程方式执行任务。这样做的好处是,执行器进程可以隔离每个Spark应用。从调度角度来看,每个驱动器可以独立调度本应用程序的内部任务。从执行器角度来看,不同Spark应用对应的任务将会在不同的JVM中运行。然而这样的架构也有缺点,多个Spark应用程序之间无法共享数据,除非把数据写到外部存储结构中。

Spark对底层的集群管理器一无所知,只要Spark能够申请到执行器进程,能与之通信即可。这种实现方式可以使Spark比较容易的在多种集群管理器上运行,例如Mesos、Yarn。

驱动器程序在整个生命周期内必须监听并接受其对应的各个执行器的连接请求,因此驱动器程序必须能够被所有Worker节点访问到。

因为集群上的任务是由驱动器来调度的,所以驱动器应该和Worker节点距离近一些,最好在同一个本地局域网中,如果需要远程对集群发起请求,最好还是在驱动器节点上启动RPC服务响应这些远程请求,同时把驱动器本身放在离集群Worker节点比较近的机器上。

Spark运行基本流程

通过上一小节了解到,Spark运行架构主要由SparkContext、Cluster Manager和Worker组成,其中Cluster Manager负责整个集群的统一资源管理,Worker节点中的Executor是应用执行的主要进程,内部含有多个Task线程以及内存空间,下面通过图2-12深入了解Spark运行基本流程。图2-12Spark运行基本流程图

Spark运行基本流程

(1)当一个Spark应用被提交时,根据提交参数在相应位置创建Driver进程,Driver进程根据配置参数信息初始化SparkContext对象,即Spark运行环境,由SparkContext负责和Cluster Manager的通信以及资源的申请、任务的分配和监控等。SparkContext启动后,创建DAG Scheduler(将DAG图分解成Stage)和Task Scheduler(提交和监控Task)两个调度模块。

(2)Driver进程根据配置参数向Cluster Manager申请资源(主要是用来执行的Executor),Cluster Manager接收到应用(Application)的注册请求后,会使用自己的资源调度算法,在Spark集群的Worker节点上,通知Worker为应用启动多个Executor。

(3)Executor创建后,会向Cluster Manager进行资源及状态的反馈,便于Cluster Manager对Executor进行状态监控,如果监控到Executor失败,则会立刻重新创建。

(4)Executor会向SparkContext反向注册申请Task。

(5)Task Scheduler将Task发送给Worker进程中的Executor运行并提供应用程序代码。

(6)当程序执行完毕后写入数据,Driver向Cluster Manager注销申请的资源。


分享到:
在线咨询 我要报名
和我们在线交谈!