【Spark精讲】Spark作业执行原理

基本流程

用户编写的Spark应用程序最开始都要初始化SparkContext。

用户编写的应用程序中,每执行一个action操作,就会触发一个job的执行,一个应用程序中可能会生成多个job执行。一个job如果存在宽依赖,会将shuffle前后划分成两个stage,前一个stage会将计算结果临时进行存储,后一个stage则进行读取,完成数据交换。

每个stage中,需要执行的计算过程会被划分成多个逻辑相同的一组Task,每个Task会被提交到Executor中运行。当Task运行完成后,会将运行结果返回至Driver中。 

主要组件

Driver端

  1. DAGScheduler:负责将Job划分为Stage,再将Stage划分为TaskSet;
  2. TaskScheduler:负责任务的调度;
  3. SchedulerBackend:负责资源的分配,并把Task提交给Executor中执行。

Executor端

  1. BlockManager:缓存RDD、缓存Task运行结果。

Job提交执行流程

Task提交

SparkContext将RDD的action操作转化为Job,并将Job交给DAGScheduler做进一步处理。

DAGScheduler首选根据shuffle划分stage,根据stage中分区的数量,生成一组Task(即TaskSet),生成Task时还会计算Task的最佳执行位置。DAGScheduler会根据RDD是否进行了缓存来确定是否具有最佳运行位置。

DAGScheduler将Stage生成TaskSet以后,会将TaskSet交给TaskScheduler进行处理,TaskScheduler负责将Task提交到集群中运行,并负责失败重试,为DAGScheduler返回事件信息等。

当有任务提交至TaskScheduler中时,TaskScheduler会通知SchedulerBackend分配计算资源。SchedulerBackend将所有可用的Executor的资源信息转换为WorkerOffer交给TaskScheduler。TaskScheduler负责根据这些WorkerOffer在相应的Executor分配TaskSet中的Task。

SchedulerBackend中通过使用Map结构记录每一个ExecutorData的映射,即可管理所有Executor的CPU使用的情况。为计算任务分配计算资源时,只需要遍历所有的ExecutorData,分配可用的资源即可。

TaskScheduler在接受到DAGScheduler提交的TaskSet以后,会为每个TaskSet创建一个TaskSetManager,用于管理该TaskSet中所有任务的运行。TaskSetManager会根据Task中的最佳运行位置计算TaskSet的所有本地运行级别,本地运行的级别决定了Task最终在哪个Executor中运行。Spark中本地运行级别从小到大可分为进程本地化、节点本地化、无优先位置、机架本地化、任意节点。

Task执行

Executor接收到SchedulerBackend提交的LaunchTask消息后,即可运行该消息中包含的Task。Executor将接收到的Task封装到TaskRunner中,TaskRunner是一个Runnable接口,从而可以将该任务提交到线程池中运行。

当在一个Executor中同时运行多个Task时,多个Task共享Executor中SparkEnv的所有组件,共用Executor中分配的内存。如使用Spark广播变量时,每个Executor中会存在一份,Executor中所有的任务会共享这一份变量。当Executor中的BlockManager缓存了某rdd某分区的数据时,在该Executor上调度使用这个RDD的这个分区的数据的Task执行,可以有效减少网络加载数据的过程,减少网络传输。

当Executor中Task运行完成时,需要将Task的运行结果返回Driver程序,Driver程序根据结果判断该Stage是否计算完成,或者该Job是否计算完成。

相关推荐

  1. Spark】SparkSQL Join选择逻辑

    2023-12-13 06:16:02       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 06:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 06:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 06:16:02       82 阅读
  4. Python语言-面向对象

    2023-12-13 06:16:02       91 阅读

热门阅读

  1. TCP/UDP 的区别及优缺点

    2023-12-13 06:16:02       53 阅读
  2. 如何用WireShark分析HFP协议

    2023-12-13 06:16:02       58 阅读
  3. 第三十三课 电商控制台增删改查接口的编写

    2023-12-13 06:16:02       63 阅读
  4. 使用rknn-toolkit2将paddleseg模型导出rknn模型

    2023-12-13 06:16:02       65 阅读
  5. LeetCode-5 最长回文子串

    2023-12-13 06:16:02       50 阅读
  6. CentOS使用kkFileView实现在线预览word excel pdf等

    2023-12-13 06:16:02       58 阅读
  7. SQL Sever 方式做牛客SQL的题目--SQL254

    2023-12-13 06:16:02       48 阅读
  8. vue3 使用html2canvas导出div指定区域内的图片

    2023-12-13 06:16:02       60 阅读
  9. RabbitMQ时空之旅:rabbitmq_message_timestamp的奇妙世界

    2023-12-13 06:16:02       57 阅读
  10. lua基本语法使用

    2023-12-13 06:16:02       58 阅读