Spark运行架构总结说明

   在分布式环境下,spark采用的是主从架构。在一个spark集群中,有一个节点负责中央协调,调度各个分布式工作节点。这个中央协调节点被称为驱动器(Driver)节点,与之对应的工作节点被称为执行器(executor)节点。驱动器节点可以和大量的执行器节点通信,它们也都作为独立的java进程运行。驱动器节点和所以的执行器节点一起被称为一个Spark运用。

驱动器节点:

spark驱动器是执行你的程序中main()方法进程 。它执行用户编写的用来创建sparkContext、创建RDD,以及进行RDD的转换操作和行动操作的代码。其实当前启动spark shell时,你就启动了一个spark驱动器程序。驱动器一旦终止,spark也就结束了。

驱动器程序在spark运用中主要有俩个职责。

  1.把用户程序转换为任务:

        spark驱动器程序负责把用户程序转换为多个物理执行的单元,这些单元也被称为task。从上层来看,所有的spark程序都遵循同样的结构:程序从输入数据创建一系列的RDD,再使用转换操作派生出新的RDD,最后使用行动操作收集或存储结果RDD中的数据。Spark程序其实是隐式的创建出了一个由操作组成的逻辑上的有向无环图DAG.当驱动器运行时,它会把这个逻辑图转换为物理执行计划。

      spark会对逻辑执行计划进行一些优化,比如将连续的映射转化为流水线化执行,将多个操作合并到一个步骤中等。这样spark就把逻辑计划转换为一系列stage。而每个stage又由多个任务组成。这些任务会被打包并发送到集群中。任务是spark的最小工作单元,用户程序一般需要启动成千上万个独立的任务。

2.为执行器节点调度任务:

      有了物理执行计划以后,spark驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程始终对程序中所有的执行器节点有完整的记录。每个执行器节点代表一个能够处理任务和存储RDD数据的进程。

     spark驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。当任务执行时,执行器会把缓存数据存储起来。而驱动器进程同样会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少网络的传输。

执行器节点:

      spark执行器节点是一种工作进程,负责在spark 作业中运行任务,任务间相互独立。spark运用启动时,执行器节点就被同时启动,并且始终伴随着整个spark应用的生命周期而存在。如果有执行器节点发生了异常奔溃,spark应用也可以继续执行。执行器进程有俩大作用:第一,他们负责运行组成spark应用的任务,并将结果返回给驱动器进程;第二,他们通过自身的Block Manager为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在执行器进程内的,因此任务在运行时充分利用缓存数据加速运算。

集群管理器:

      spark依赖于集群管理器来启动执行器节点,而在某些特殊的情况下,也依赖集群管理器来启动驱动器节点。集群管理器是spark中可插拔式组件。这样,除了spark自带的独立集群管理器,spark也可以运行在其他外部集群管理器上,比如yarn和Mesos.

spark程序整体运行流程如下:

  1.用户通过spark-submit脚本提交应用。

  2.spark-submit脚本启动驱动器程序,调用用户定义的main()方法。

  3.驱动器程序与集群管理器程序通信,申请资源以启动执行器节点。

  4.集群管理器为驱动器程序启动执行器节点。

  5.驱动器进程执行用户应用的操作。根据程序中所定义的对RDD的转换操作和行动操作,驱动器节点把工作以任务的形式发送    到执行器进程。

  6.任务在执行器程序中进行计算并保存结果。

  7.如果驱动器程序的main()方法退出,或者调用了sparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。

 

猜你喜欢

转载自blog.csdn.net/sujins5288/article/details/93068221
今日推荐