`
bit1129
  • 浏览: 1070562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Spark四十六】Spark RDD物理执行图与Stage

 
阅读更多

理解记忆如下要点:

1. 划分Stage的方法是从后向前,遇到 shuffle Dependency就断开,如果是Narrow Dependency就划入当前的Stage。所以,ShuffledRDD通常是一个Stage的开头(Stage的开头未必是 ShuffledRDD,也有可能是数据源转换而来的RDD)。所以上面一共3个Stage。需要注意的是,shuffle的结果未必成为 ShuffledRDD,例如上面的CoGroupedRDD,一半来源于Shuffle。

2. 每个 stage 里面 task 的数目由该 stage 最后一个 RDD 中的 partition 个数决定。Task分为两类,一类是ShuffleMapTask,一类是ResultTask。而且一个Stage中的Task类型只能是其中一种类型

3. 数据用的时候再算,而且数据是流到要计算的位置的。所谓用到的时候再算,是指从后向前,本RDD追溯父RDD的数据,直到数据源,然后数据源的原始数据,依次经历所有的RDD的算子转换操作。所谓的计算位置,指的是ShuffleMapTask或者ResultTask运行的地方

4.对于没有 parent stage 的 stage,该 stage 最左边的 RDD 是可以立即计算的,而且每计算出一个 record 后便可以流入 f 或 g(所谓的f,g是指RDD链上的不同RDD的算子操作)。如 果 f 中的 record 关系是 1:1 的,那么 f(record1) 计算结果可以立即顺着 computing chain 流入 g 中。如果 f 的 record 关系是 N:1,record1 进入 f() 后也可以被回收。总结一下,computing chain 从后到前建立,而实际计算出的数据从前到后流动,而且计算出的第一个 record 流动到不能再流动后,再计算下一个 record。这样,虽然是要计算后续 RDD 的 partition 中的 records,但并不是要求当前 RDD 的 partition 中所有 records 计算得到后再整体向后流动。(这段话描述了,RDD的元素计算不是全部加载然后再计算,是边加载边计算的模式)

5. 对于有 parent stage 的 stage,先等着所有 parent stages 中 final RDD 中数据计算好,然后经过 shuffle 后,问题就又回到了计算 “没有 parent stage 的 stage”。这里明确了Stage依赖之后,依赖的Stage的任务必须先执行完,然后才开始下一个任务。而不是依赖的Stage任务完成了一部分,然后下个Stage的任务就开始执行了。

6. RDD的实现细节:

6.1每个 RDD 包含的 getDependency() 负责确立 RDD 的数据依赖

6.2 compute() 方法负责接收 parent RDDs 或者 data block 流入的 records,进行计算,然后输出 record。

经常可以在 RDD 中看到这样的代码firstParent[T].iterator(split, context).map(f)。firstParent 表示该 RDD 依赖的第一个 parent RDD,iterator() 表示 parentRDD 中的 records 是一个一个流入该 RDD 的,map(f) 表示每流入一个 recod 就对其进行 f(record) 操作,输出 record。为了统一接口,这段 compute() 仍然返回一个 iterator,来迭代 map(f) 输出的 records。

总结一下:整个 computing chain 根据数据依赖关系自后向前建立,遇到 ShuffleDependency 后形成 stage。在每个 stage 中,每个 RDD 中的 compute() 调用 parentRDD.iter() 来将 parent RDDs 中的 records 一个个 fetch 过来。

 

 

给定一个逻辑执行图,如何进行Stage划分,如下所示的逻辑执行图,包含几个Stage?

 

 

 

 

 cartesian算子对应的窄依赖逻辑图和物理图



 

 上图中,包含了六个ResultTask,仅有ResultTask,比如黑色线对应的这个Result,它需要计算两个数据块,然后对3个RDD的partition进行处理,这一整套的过程都是在一个ResultTask中执行的,ResultTask个数与最后一个RDD的分区数(这里是CartesianRDD)相同

 

插播一个computing chain的图片,在最开始出用到了

 

 

 

 

  • 大小: 156.8 KB
  • 大小: 206.2 KB
  • 大小: 186.1 KB
  • 大小: 163.8 KB
分享到:
评论

相关推荐

    10 实战解析spark运行原理和RDD解密

    在 Spark 中,RDD 的计算逻辑可以被分为多个 Stage,每个 Stage 又可以被分为多个 Task。Task 的计算逻辑是一样的,只是处理的数据不同。如果 Task 失败,会自动进行特定次数的重试。如果 Stage 失败,会自动进行...

    Apache Spark RDD面试题

    #### 十四、广播变量的可修改性 - **知识点**:广播变量一旦创建就不能被修改。 - **解释**:广播变量在创建后是不可修改的。这意味着一旦数据被广播出去,就不能再改变其内容。 #### 十五、Executor 中广播变量的...

    大数据技术实践——Spark词频统计

    4. **DAG与Stage构建**:Spark会根据操作构建有向无环图(DAG),并将DAG划分为Stage,便于并行处理。 5. **Task执行**:Task Scheduler将Task发送给Executor执行,Executor在内存中处理数据。 6. **资源释放**:...

    spark笔记整理文档

    提交Spark作业后,Driver会将作业分解为Stage(基于shuffle划分),然后提交Task到Executor执行。Executor在内存中缓存数据,并在本地执行任务,提高整体性能。 7. Spark内存管理: Spark利用内存存储中间结果,...

    spark安装包+spark实验安装软件

    Spark的核心组件包括:Spark Core、Spark SQL、Spark Streaming、MLlib(机器学习库)和GraphX(图计算)。Spark Core提供了基础的分布式任务调度和内存管理机制;Spark SQL用于结构化数据处理,支持SQL查询;Spark ...

    深入理解Spark 核心思想与源码分析

    4. **DAG执行计划**:Spark将一系列转换和行动组织成有向无环图(DAG),然后优化执行计划,以减少数据移动和提高效率。 5. **Stage划分**:Spark将DAG拆分成多个阶段(Stage),每个阶段对应一次shuffle操作,降低...

    超详细Spark思维导图

    3. **Spark SQL**:Spark SQL是Spark用于处理结构化数据的模块,它将SQL查询与DataFrame和Dataset API相结合,允许开发者在SQL和DataFrame/Dataset API之间无缝切换,提高了开发效率。 4. **Spark Streaming**:...

    Learning.Spark.pdf(英文版)+图解Spark核心技术与案例实战.pdf

    书中详细解析了Spark作业的执行流程,包括Stage划分、Task调度以及 Shuffle过程,这些是理解Spark性能优化的关键。此外,书中还涉及了Spark与Hadoop、Hive等其他大数据组件的集成,以及如何在实际项目中运用Spark...

    apache spark的设计与实现

    物理执行图是由逻辑执行图经过优化后生成的,旨在提高执行效率。 - **Task执行**:每个Task在一个Executor进程内的线程中运行。 - **依赖处理**:处理Stage间的依赖关系,如Shuffle操作。 #### 四、Shuffle过程 ...

    深入理解SparkStreaming执行模型

    综上所述,Spark Streaming通过其独特的微批处理执行模型,将实时数据流处理问题转换成了Spark Core中熟悉的RDD处理问题,同时结合了内存计算的优势和与其他大数据组件的良好集成性,为实时数据处理提供了强大的工具...

    Spark实战高手之路-第5章Spark API编程动手实战(1)

    - **Stage划分**:在Spark作业执行过程中,Stage是根据宽依赖划分的最小执行单元。每个Stage包含了一系列的任务,这些任务可以在不同的Worker节点上并行执行。合理地划分Stage可以显著提升程序的执行效率。 #### 五...

    Spark技术内幕 深入解析Spark内核架构设计与实现原理

    《Spark技术内幕:深入解析Spark内核架构设计与实现原理》是一本专注于揭示Spark核心机制的专著。这本书深入浅出地介绍了Spark如何处理大数据,包括其执行引擎、内核架构以及不同执行阶段的调度策略。Spark作为一种...

    spark运行原理讲解

    当Spark接收到行动操作后,会构建一个有向无环图(DAG),表示所有转换操作的顺序。DAG Scheduler将DAG分解为任务阶段(Stage),阶段内的任务可以并行执行。Stage划分基于宽依赖(Shuffle Dependency),即涉及全...

    五分钟学大数据-Spark 面试八股文1

    Stage 是 Spark 任务的物理执行单位,划分的依据是宽依赖和窄依赖。宽依赖涉及到数据的 shuffle,导致跨节点的数据传输;窄依赖仅依赖前一阶段的分区,可以在同一 Executor 内并行执行。 数据倾斜与解决方案: 数据...

    Spark简介以及其生态圈

    DAGScheduler将用户程序转换为Stage的有向无环图(DAG),而TaskScheduler负责将这些Stage拆分成Task,并将Task发送到相应的Executor上执行。 在Spark的不同集群运行架构中,Spark可以在Standalone模式、YARN模式...

    Spark技术内幕 深入解析Spark内核架构设计与实现原理 ,张安站著 ,P202

    《Spark技术内幕:深入解析Spark内核架构设计与实现原理》是张安站撰写的一本专著,书中详细探讨了Apache Spark这一分布式计算框架的核心设计理念和实现机制。Spark以其高效、易用和灵活的特点,成为了大数据处理...

    spark-RDD的特性介绍及源码阅读必备基础

    2. **构建执行计划**:调用转换和动作算子后,RDD的血缘关系确定,DAGScheduler根据依赖关系划分Stage,最终封装成TaskSet。 3. **调度执行任务**:TaskScheduler和TaskSetManager调度Task到Executor执行,考虑最佳...

    Spark源码剖析

    3. **DAG 执行引擎**:Spark 使用 Directed Acyclic Graph (DAG) 来表示作业的执行计划,这个 DAG 被分解成一系列的 Stage,每个 Stage 包含多个 Task。这种设计使得任务调度更为高效,并能充分利用数据局部性。 4....

Global site tag (gtag.js) - Google Analytics