基本概念
*& RDD
是弹性分布式数据集,【我也不太清楚这个概念】。是一个分布式抽象内存的概念,提供了一种高度受限的共享内存模型【完成流运算,迭代运算,交互运算】
*& DAG
(有向无环图)的简称。反映了RDD之间的依赖关系
*&Executor
是一个运行在worknode 上的一个进程。负责运行任务。并且为应用程序存取数据
*& 应用:
用户编写的Spark程序
*& 任务:
运行在Executor上的工作单元
*& 作业:
一个作业包含多个RDD和作用在相应RDD上的各种操作
*&阶段:
是作业的基本调度单位。一个作业会分为多组任务,每组任务被称为阶段,或者被称为任务集。
架构设计
Spark运行架构包括集群资源管理器(cluster Manager) 运行作业任务的工作节点(worknode),每个应用的任务的控制节点(driver)和在没一个工作节点上负责具体执行任务的Executor 过程。
Spark 采用excutor的优点
1.利用多线程来只选执行具体任务【Hadoop 是采用进程模型】来减少任务的启动开销
2.在executor中有一个BlockManger 存储模块。 会将内存和硬盘共同作为存储设备,当需要进行迭代运时候,可以将中间结果存储到这个模块中,下次需要时候,直接读取该存储模块中的数据,而不需要读取HDFS中的数据,减少I/O操作;或者再交互式查询场景下,预先将表缓存到该存储模块上,从而提高I/O性能。
spark运行架构
在Spark中一格应用有一个Driver节点和多个job作业组成,一个作业由多个阶段【stage】组成,一个阶段由多个task 组成。
当执行一个应用时候,clustermanger,申请资源,启动Executor,并向Executor 发送文件和代码。在Executor上执行任务,任务结束后,执行结果返回给Driver 或者写入到HDFS.Hbase
Spark执行流程
(1)当一个Spark应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务控制节点(Driver)创建一个SparkContext,由SparkContext负责和资源管理器(Cluster Manager)的通信以及进行资源的申请、任务的分配和监控等。SparkContext会向资源管理器注册并申请运行Executor的资源;
(2)资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着“心跳”发送到资源管理器上;
(3)SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解成多个“阶段”(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler)进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor;
(4)任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。
Spark 特点
(1)每个应用都有自己专属的Executor进程,并且该进程在应用运行期间一直驻留。Executor进程以多线程的方式运行任务,减少了多进程任务频繁的启动开销,使得任务执行变得非常高效和可靠;
(2)Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可;
(3)Executor上有一个BlockManager存储模块,类似于键值存储系统(把内存和磁盘共同作为存储设备),在处理迭代计算任务时,不需要把中间结果写入到HDFS等文件系统,而是直接放在这个存储系统上,后续有需要时就可以直接读取;在交互式查询场景下,也可以把表提前缓存到这个存储系统上,提高读写IO性能;
(4)任务采用了数据本地性和推测执行等优化机制。数据本地性是尽量将计算移到数据所在的节点上进行,即“计算向数据靠拢”,因为移动计算比移动数据所占的网络资源要少得多。而且,Spark采用了延时调度机制,可以在更大的程度上实现执行过程优化。比如,拥有数据的节点当前正被其他的任务占用,那么,在这种情况下是否需要将数据移动到其他的空闲节点呢?答案是不一定。因为,如果经过预测发现当前节点结束当前任务的时间要比移动数据的时间还要少,那么,调度就会等待,直到当前节点可用。
体会:
要想了解架构,先把各个节点之间的关系弄清楚,谁包含谁,谁在谁上面运行。比如Spark包含一个控制节点,多个工作job节点,工作节点 又包含多个阶段stage。阶段又包含多个task .一个worknode 上有一个executor 应用通过Driver 中的SparkConnect 告知cluster manager,cm 开始一系列的申请调度资源,启动所有的executor,然后想executor发送代码文件,在executor上执行,然后把执行结果返回给driver或者存到hbase中去.