一、Spark架构设计
1、Spark运行架构由下面四部分组成:
(1)集群资源管理器(Cluster Manager):YARN或者Mesos等资源管理框架。
(2)运行作业任务的工作节点(Worker Node)。
(3)每个应用的任务控制节点(Driver Program/Driver)。
(4)每个工作节点上负责具体任务的执行进程(Executor)。
2、与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:
(1)利用多线程执行具体的任务(Hadoop MapReduce采用的是进程模型),减少任务的启动开销;
(2)Executor有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备(默认使用内存,当内存不够时,会写到磁盘),当需要多轮迭代计算时,可以将中间结果存储到这个存储模块里,下次需要时,就可以直接读取该存储模块里的数据,而不需要读取HDFS等文件系统的数据,因而有效减少了I/O开销,或者在交互式查询场景下,预先将表缓存到该存储系统上,从而可以提高读写I/O性能。
3、任务执行流程原理
一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成,一个作业由多个阶段(Stage)构成,一个阶段由多个任务(Task)组成。
当执行一个应用时,任务控制节点会向集群资源管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行任务,运行结束后,执行结果会返回给任务控制节点Driver,写到HDFS或者其他数据库中。
二、Spark运行基本流程
1、当一个spark应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务控制节点(Driver)创建一个SparkContext对象,由Sparkcontext负责和资源管理器的通信以及进行资源的申请、任务的分配和监控等,SparkContext会向资源管理器注册并申请运行Executor的资源,SparkContext可以看成是应用程序连接集群的通道。
2、资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着"心跳"发送到资源管理器上。
3、SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器进行解析,将DAG图分解成多个‘阶段’(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor。
4、任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。