11.Spark之运行模式及原理

1.Spark运行模式

    Spark的运行模式多种多样,灵活多变。

  1. 部署在单机上时,既可以用本地模式运行,也可以用伪分布式模式运行。

  2. 以分布式集群方式部署时,也有众多的运行模式可供选择,这取决于集群的实际情况。底层的资源调度既可以依赖于外部的资源调度框架(Mesos、Yarn),也可以使用Spark内建的Standalone模式。

    实际应用中,Spark应用程序的运行模式取决于传递给SparkContext的MASTER环境变量的值,个别模式还需要依赖辅助的程序接口来配合使用,目前支持的MASTER环境变量由特定的字符串或URL所组成,如下所示:

  • Local[N]:本地模式,使用N个线程。

  • Local cluster[worker,core,Memory]:伪分布式模式,可以配置所需要启动的虚拟工作节点的数量,以及每个节点所管理的CPU数量和内存尺寸。

  • Spark://hostname:port:Standalone模式,需要部署Spark到相关节点,URL为Spark Master主机地址和端口。

  • Mesos://hostname:port:Mesos模式,需要部署Spark和Mesos到相关节点,URL为Mesos主机地址和端口。

  • YARN standalone/YARN cluster:YARN模式一,主程序逻辑和任务都运行在YARN集群中。

  • YARN client:YARN模式二,主程序逻辑运行在本地,具体任务运行在YARN集群中。

2.Spark基本工作流程

    运行模式尽管看起来差异很大,但总体来讲都基于一个相似的工作流程。它们从根本上都是将Spark的应用分为任务调度和任务执行两个部分。下图所示的是分布式模式下,Spark的各个调度和执行模块的大致框架图。对于本地模式来说,其内部程序逻辑结构也是类似的,只是其中部分模块有所简化,例如集群管理模块简化为进程内部的线程池。

    11.Spark之运行模式及原理_第1张图片

    具体来说,以SparkContext为程序运行的总入口,在SparkContext的初始化过程中,Spark会分别创建DAGScheduler作业调度和TaskScheduler任务调度两级调度模块。

    其中作业调度模块是基于任务阶段的高层调度模块,它为每个Spark作业计算具有依赖关系的多个调度阶段(通常根据shuffle来划分),然后为每个阶段构建出一组具体的任务(通常会考虑数据的本地性),然后以TaskSets(任务组)的形式提交给任务调度模块来具体执行。而任务调度模块则负责具体启动任务、监控和汇报任务运行情况。

    作业调度模块和具体部署运行模式无关,在各种运行模式下逻辑相同。

    不同运行模式的区别主要体现在任务调度模块。不同的部署和运行模式,根据底层资源调度方式的不同,各自实现了自己特定的任务调度模块,用来将任务实际调度给对应的计算资源。

3.相关基本类

  • TaskScheduler / SchedulerBackend

    为了抽象出一个公共的接口供DAGScheduler作业调度模块使用,所有的这些运行模式实现的任务调度模块都是基于这两个接口(Trait)的:TaskSceduler及SchedulerBackend。

    TaskSceduler的实现主要用于与DAGScheduler交互,负责任务的具体调度和运行,其核心接口是submitTasks和cancleTasks。

    SchedulerBackend的实现是与底层资源调度系统交互(如Mesos/YARN),配合TaskSceduler实现具体任务执行所需要的资源分配,核心接口是receiveOffers。

  • TaskSchedulerImpl

    TaskSchedulerImpl实现了TaskSceduler接口,提供了大多数本地和分布式运行调度模式的任务调度接口。

    此外它还实现了resourceOffers和statusUpdate这两个接口供Backend调用,用于提供调度资源和更新任务状态。

    另外,在提交任务和更新状态等阶段,TaskSchedulerImpl都会调用Backend的receiveOffers函数,用于发起一次任务资源调度请求。

  • Executor

    实际任务的运行,最终都由Executor类来执行,Executor对每一个任务创建一个TaskRunner类,交给线程池运行。运行结果通过ExecutorBackend接口返回。



你可能感兴趣的:(11.Spark之运行模式及原理)