Spark 运行架构和解析《一》

来源:互联网 发布:java递归算法方程式 编辑:程序博客网 时间:2024/06/06 15:03

1.相关概念

 

Job : 包含多个 Task 组成的并行计算,往往由 Spark action 催生。

Stage : Job 的调度单位,对应于TaskSet 。

TaskSet :一组关联的、相互之间没有 shuffle 依赖关系的任务组成的任务集。

Task : 被送到某个 executor 上的工作单元。

他们之间的关系:



2.运行架构

 

(1)简单运行架构图


driver向集群申请资源,集群分配资源,启动executordriverspark应用程序的代码和文件传送给executorexecutor上运行task,运行完之后将结果返回给driver或者写入外界。

2)复杂运行架构图


提交应用程序,构建sparkContext,构建DAG图,提交给scheduler进行解析,解析成一个个stage,提交给集群,由集群任务管理器进行调度,集群启动spark executordriver把代码和文件传给executorexecutor进行各种运算完成task任务。driver上的block tracker记录executor在各个节点上产生的数据块。task运行完之后,将数据写入HDFS上或者其他类型数据库里。

(3)全面运行架构图


spark应用程序进行各种transformation的计算,最后通过action触发job。提交之后首先通过sparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler进行解析,解析时是以shuffle为边界,反向解析,构建stagestage之间也有依赖关系。这个过程就是对DAG图进行解析划分stage,并且计算出各个stage之间的依赖关系。然后将一个个TaskSet提交给底层调度器,在spark中是提交给taskScheduler处理,生成TaskSet manager,最后提交给executor进行计算,executor多线程计算,计算完反馈给TaskSetmanager,再反馈给taskScheduler,然后再反馈回DAGScheduler。全部运行完之后写入数据。

1)DAGScheduler

 DAGScheduler 构建 Stage

记录哪个 RDD 或者Stage 输出被物化

重新提交 shuffle 输出丢失的 stage

将 Taskset 传给底层调度器

– spark-cluster TaskScheduler 

– yarn-cluster YarnClusterScheduler 

– yarn-clientYarnClientClusterScheduler


2)TaskScheduler

 

为每一个 TaskSet 构建一个 TaskSetManager 实例管理这个 TaskSet 的生命周期

数据本地性决定每个 Task 最佳位置 (process-local, node-local, rack-local and then an y) 

提交 taskset( 一组task) 到集群运行并监控

推测执行,碰到 straggle 任务需要放到别的节点上重试 出现 shuffle 输出lost 要报告 fetch failed 错误


4)深入运行架构图



应用程序提交后,触发action,构建sparkContext,构建DAG图,提交给DAGScheduler,构建stage,以stageSet方式提交给TaskScheduler,构建taskSet Manager,然后将task提交给executor运行。executor运行完task后,将完成信息提交给schedulerBackend,由它将任务完成的信息提交给TaskSchedulerTaskScheduler反馈信息给TaskSetManager,删除该task任务,执行下一个任务。同时TaskScheduler将完成的结果插入到成功队列里,加入之后返回加入成功的信息。TaskScheduler将任务处理成功的信息传给TaskSet Manager。全部任务完成后TaskSet Manager将结果反馈给DAGScheduler。如果属于resultTask,交给JobListener。如果不属于resultTask,保存结果。


注:

一共有二种Task : shuffleMapTask和 ResultTask ,被执行的task 多数都是 shuffleMapTask


 1)ResultTask

ResultTask ( FinalStage 所对应的任务) , 返回给 driver 的是运算结果本身

– 结果足够小,则直接放在 DirectTaskResult 对象内

– 超过特定尺寸(默认约 10 M B )则在 E xecutor 端会将 DirectTaskResult 先序列化,再把序 列化的结果作为一个 B lock 存放在 B lockManager 里,而后将 B lockManager 返回的 B lock I D 放在 I ndirectTaskResult 对象中返回给 driver 


2) ShuffleMapTask

 ShuffleMapTask ,返回给 DAGScheduler 的是一个 MapStatus 对象, MapStatus 对象管理了 Shu ffleMapTask 的运算输出结果在 Shuffle BlockManager 里的相关存储信息,而非结果本身,这些 存储位置信息将作为下一个 Stage 的任务的获取输入数据的依据 

shuffle 的结果 patition 数目由ShuffleDependency 中的 Partitioner 对象来决定

Spark 内核将提供一个可拔插的 shuffle 接口。


3.BlockManager



0 0