Spark运行架构
基本概念
- RDD:分布式内存的抽象概念,高度受限的共享内存模型
- DAG:有向无环图,反应RDD的依赖关系
- Executot:运行在工作节点的一个进程,负责运行任务,存储数据
- 任务Task:运行在Executor上的工作单元
- 作业:一个作业包含多个RDD及作用于相应RDD的操作
- 阶段Stage:作业调度的基本单位,以宽依赖、窄依赖划分。
架构设计
Spark的运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Work Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的进程(Executor)
其中,Executor使用多线程来执行具体任务,减少任务的启动开销;其还有一个BlockManager存储模块,将内存和磁盘共同作为存储设备,内存作为默认存储,不够时,写入磁盘。因此减少了IO开销。
Spark运行基本流程
- 首先为应用构建基本运行环境,由任务控制节点Driver创建一个Spark Context对象,由该对象与资源管理器通信,申请资源和任务的调配
- 资源管理器为Executor分配资源,启动进程,Executor随时和资源管理器保持通信,利用心跳
- Spark Context根据RDD的依赖关系构建相应的DAG图,将DAG图提交给DAG调度器(DAG Scheduler),其将DAG划分成多个Stage,把每个任务集提交给底层的Task Scheduler处理。同时,Spark Context把应用代码发给Executor
- 任务在Executor上运行,把结果返回任务调度器再返回DAG调度器,写入数据后释放资源
RDD的设计与运行原理
一个RDD就是一个分布式对象集合,只读的分区记录集合。每个分区就是一个数据记录片段。
对RDD的操作由转换操作(map join groupby)和行动操作(count collect)组成
行动操作接收一个RDD,但返回结果不是RDD。同时RDD只适合粗粒度操作。RDD采用惰性机制,转换并不会立刻执行,只有行动才会发生计算。
采用惰性调用机制,RDD操作就可以实现管道化,避免数据同步的等待。
RDD有高容错性,不通过数据冗余来达到容错。而且RDD只读,避免修改。存放的数据是Java对象,避免了不必要的对象序列化和反序列化开销。Hadoop中经常要进行IO磁盘开销,序列化和反序列化开销也大。
Spark根据DAG的RDD依赖关系划分阶段,每个RDD操作都是fork\join操作,实行流水线优化后,减少中间结果join,提高了性能。
来源:https://www.cnblogs.com/chenshaowei/p/12378443.html