Spark运行原理

人走茶凉 提交于 2020-02-28 19:54:55

Spark运行架构

基本概念

  • RDD:分布式内存的抽象概念,高度受限的共享内存模型
  • DAG:有向无环图,反应RDD的依赖关系
  • Executot:运行在工作节点的一个进程,负责运行任务,存储数据
  • 任务Task:运行在Executor上的工作单元
  • 作业:一个作业包含多个RDD及作用于相应RDD的操作
  • 阶段Stage:作业调度的基本单位,以宽依赖、窄依赖划分。

架构设计

Spark的运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Work Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的进程(Executor)

其中,Executor使用多线程来执行具体任务,减少任务的启动开销;其还有一个BlockManager存储模块,将内存和磁盘共同作为存储设备,内存作为默认存储,不够时,写入磁盘。因此减少了IO开销。

Spark运行基本流程

  1. 首先为应用构建基本运行环境,由任务控制节点Driver创建一个Spark Context对象,由该对象与资源管理器通信,申请资源和任务的调配
  2. 资源管理器为Executor分配资源,启动进程,Executor随时和资源管理器保持通信,利用心跳
  3. Spark Context根据RDD的依赖关系构建相应的DAG图,将DAG图提交给DAG调度器(DAG Scheduler),其将DAG划分成多个Stage,把每个任务集提交给底层的Task Scheduler处理。同时,Spark Context把应用代码发给Executor
  4. 任务在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,提高了性能。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!