首页 理论教育 了解Spark的工作原理和流程

了解Spark的工作原理和流程

时间:2023-06-20 理论教育 版权反馈
【摘要】:图4-1 所示是Spark官网提供的Spark运行时的基本工作流程图图4-1 Spark基本工作流程图任何spark的应用程序都包含Driver代码和Executor代码。在创建SparkContext对象的同时也自动创建了这两个类。待所有的Stage都执行完毕后,将会最终达到应用程序的目标,或者输出到文件、或者在屏幕显示等,Driver的本次运行过程结束,等待用户的其他指令或者关闭。在用户显式关闭SparkContext后,整个运行过程结束,相关的资源被释放或回收。

了解Spark的工作原理和流程

图4-1 所示是Spark官网提供的Spark运行时的基本工作流程图

978-7-111-52860-9-Chapter04-3.jpg

图4-1 Spark基本工作流程图

(1)任何spark的应用程序都包含Driver代码和Executor代码。Spark应用程序首先在Driver初始化SparkContext。因为SparkCotext是Spark应用程序通往集群的唯一路径,在SparkContext里面包含了DAGScheduler和TaskScheduler两个调度器类。在创建SparkContext对象的同时也自动创建了这两个类。

(2)SparkContext初始化完成后,首先根据Spark的相关配置,向Cluster Master申请所需要的资源,然后在各个Worker结点初始化相应的Executor。Executor初始化完成后,Driv-er将通过对Spark应用程序中的RDD代码进行解析,生成相应的RDD graph(RDD图),该图描述了RDD的相关信息及彼此之间的依赖关系。

(3)RDD图构建完毕后,Driver将提交给DAGScheduler进行解析。DAGScheduler在解析RDD图的过程中,当遇到Action算子后将进行逆向解析,根据RDD之间的依赖关系以及是否存在shuffle等,将RDD图解析成一系列具有先后依赖关系的Stage。Stage以shuffle进行划分,即如果两个RDD之间存在宽依赖的关系,DAGScheduler将会在这RDD之间拆分为两个Stage进行执行,且只有在前一个Stage(父Stage)执行完毕后,才执行后一个Stage。

(4)DAGScheduler将划分的一系列的Stage(TaskSet),按照Stage的先后顺序依次提交给底层的调度器TaskScheduler去执行。

(5)TaskScheduler接收到DAGScheduler的Stage任务后,将会在集群环境中构建一个TaskSetManager实例来管理Stage(TaskSet)的生命周期。(www.xing528.com)

(6)TaskSetManager将会把相关的计算代码、数据资源文件等发送到相应的Executor上,并在相应的Executor上启动线程池执行。TaskSetManager在执行过程中,使用了一些优化算法,用于提高执行的效率,譬如根据数据本地性决定每个Task最佳位置、推测执行碰到Straggle任务需要放到别的结点上重试、出现shuffle输出数据丢失时要报告fetch failed错误等机制。

(7)在Task执行的过程中,可能有部分应用程序涉及到I/O的输入输出,在每个Exec-utor由相应的BlockManager进行管理,相关BlockManager的信息将会与Driver中的Block tracker进行交互和同步。

(8)在TaskThreads执行的过程中,如果存在运行错误、或其他影响的问题导致失败,TaskSetManager将会默认尝试3次,尝试均失败后将上报TaskScheduler,TaskScheduler如果解决不了,再上报DAGScheduler,DAGScheduler将根据各个Worker结点的运行情况重新提交到别的Executor中执行。

(9)TaskThreads执行完毕后,将把执行的结果反馈给TaskSetManager,TaskSetManager反馈给TaskScheduler,TaskScheduler再上报DAGScheduler,DAGScheduler将根据是否还存在待执行的Stage,将继续循环迭代提交给TaskScheduler去执行。

(10)待所有的Stage都执行完毕后,将会最终达到应用程序的目标,或者输出到文件、或者在屏幕显示等,Driver的本次运行过程结束,等待用户的其他指令或者关闭。

(11)在用户显式关闭SparkContext后,整个运行过程结束,相关的资源被释放或回收。从以上工作流程上可以看出,所有的Spark程序都离不开SparkContext和Executor两部分,每个Spark Application都有自己的Executor进程,此进程的生命周期和整个Application的生命周期相同,此进程内部维持着多个线程来并行地执行分配给它的Task。这种运行形式有利于不同Application之间的资源调度隔离,但也意味着不同的Application之间难以做到相互通信和信息交换。同时需要注意由于Driver负责所有的任务调度,所以他应该尽可能地靠近Worker结点,如果能在一个网络环境中那就更好了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈