spark中生成stage的过程中,是如何得知某个rdd的缓存情况。

经过查看源代码spark2.0得知,在DagScheduler中,存在一个名为cacheLocs的变量,存储了每个RDD分区的缓存位置,定义如下:

  //org.apache.spark.scheduler.DAGScheduler

  /**
   * Contains the locations that each RDD's partitions are cached on.  This map's keys are RDD ids
   * and its values are arrays indexed by partition numbers. Each array value is the set of
   * locations where that RDD partition is cached.
   *
   * All accesses to this map should be guarded by synchronizing on it (see SPARK-4454).
   */
  private val cacheLocs = new HashMap[Int, IndexedSeq[Seq[TaskLocation]]]

得知rdd缓存情况的主要流程如下:

//org.apache.spark.scheduler.DAGScheduler

1)handleJobSubmitted
2)submitStage
3)getMissingParentStages
4)getCacheLocs

通过调用getCacheLocs(),访问cacheLocs变量得知rdd缓存情况。

在生成stage过程中,一旦回溯到某个rdd,并得知此rdd已经缓存,则停止回溯。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在spark,划分stage的方法是根据shuffle操作和依赖关系分析来确定。如果两个RDD之间存在shuffle操作,那么它们之间就需要划分一个新的stage。同时,spark还会通过依赖关系判断哪些RDD需要重新计算,哪些可以直接从缓存读取,从而进一步优化stage的划分。 ### 回答2: 在Spark,任务被划分为不同的Stage以便于任务的并行执行。一个Stage包含一组任务(tasks),它们拥有相同的Shuffle操作或相同的数据依赖关系。划分Stage的目的是将类似的任务放在同一个Stage,以便于并行执行,提高计算效率和性能。 在SparkStage可以划分成两种不同的类型:Shuffle Map Stage和 Result Stage。Shuffle Map Stage包含需要执行Shuffle操作的Map任务,而Result Stage仅包含Reduce任务。 划分Stage过程一般分为以下几个步骤: 1. DAG划分:根据RDD之间的依赖关系,将整个计算过程拆分成一系列的阶段(Stage)。 2. 任务划分:针对每个Stage,将计算任务划分成多个Task,使得每个Task的数据分布尽可能均匀。 3. 数据切分:将RDD的数据切分成多个分区(Partition),每个Partition的大小一般为64MB 或128MB,以便于分布式计算。 4. Shuffle操作:将一个RDD的数据通过网络传输到其他节点上进行计算,需要进行Shuffle操作。Shuffle会将数据进行分区、排序和合并等操作,生成新的RDD。 5. 执行计算:对每个Stage的Task进行分配并发执行,等待所有Task执行完毕后,将间结果存放在内存或磁盘上。 6. Result Stage:将所有的间结果收集到一个节点上,执行Reduce操作,得到最终的结果。 总的来说,划分Stage的目的是将大规模的计算任务拆分成更小的任务,以利于整个计算过程的并行执行。在Spark,划分Stage过程是由Spark本身负责管理的,开发者只需要合理地设计和调优Spark作业,便可充分发挥RDDStage的计算优势。 ### 回答3: Spark是一种高速且强大的计算框架,能够有效地处理大规模数据。Spark使用分布式计算的方式进行数据处理,它将任务分割成多个作业来执行,每一个作业由多个阶段(stage)组成。划分成多个阶段的好处是能够最大化地利用计算资源,提高计算效率。下面是在Spark划分stage的简述: 1. 划分阶段的依据 在Spark,阶段的划分是根据传输依赖关系来进行的。具体来说,Spark的每一个任务都可以被看做是一组任务的有向无环图,其边代表着数据依赖关系。在一个作业,每一个阶段都会包含若干个任务,它们的输入数据都来自上一个阶段的输出,每个阶段之间的数据传输是通过Shuffle(洗牌)来实现的。这些依赖关系指导了阶段的划分,Spark将每一个阶段之间的Shuffle过程作为划分依据。 2. 数据传输和计算任务的划分 Spark的任务划分顺序是从下到上,即从数据传输任务划分开始,然后划分计算任务。过程如下: 第一步:划分Shuffle任务。Spark会根据数据的分片情况以及Shuffle操作的Dependency对象来确定在阶段哪些数据需要传输,哪些数据可以复用。将需要传输的数据进行划分,分别存放在不同的Map任务,并且任务的个数与Shuffle对象关联的Reducer的个数一致。 第二步:对于每一个Map任务来说,Spark会根据所在的分片对Task进行划分。将一个分片的Task都划分到同一个Stage,称之为Map Stage,并且不同的Map Stage之间不存在依赖关系。 第三步:Shuffle之后,每个Reducer获得了来自多个Map任务的模块数据。Reducer会启动Reduce任务,依次处理每一个 Mapper 的输出,最后获得结果。Spark将们这些Reducer任务划分为一个新的Stage,成为Reduce Stage。 3. 执行阶段 SparkStage之间相互独立,一个Stage的任务可以并行执行。Spark通过Stage之间的依赖关系来确定任务执行的顺序,一个Stage的task执行完成后,才会执行下一个Stage的Task。每个Stage都有一个独立的计算操作,它们之间不会互相干扰。在执行过程Sparkstage默认是顺序执行,这样可以减少对容错机制的影响。Spark是一种基于内存的计算模型,有着很快的计算速度和高效的容错机制,尤其适合处理大规模数据求解计算问题。这些特性让Spark成为了当今大数据处理领域里最主流的解决方案之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值