RDD源码的count方法:
从上面代码可以看出来,count方法触发SparkContext的runJob方法的调用:
进入 runJob(rdd, func, 0 until rdd.partitions.size, false)方法:
进一步跟踪runJob(rdd, (context: TaskContext, iter: Iterator[T]) => func(iter), partitions, allowLocal)方法:
继续跟踪进入runJob[T, U](rdd, func, partitions, allowLocal, (index, res) => results(index) = res)方法:
代码分析:
1、getCallSite :
2、clean(func):
3、dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, allowLocal, resultHandler, localProperties.get):
代码分析:
3.1、进入submitJob(rdd, func, partitions, callSite, allowLocal, resultHandler, properties):
上面代码分析:
3.1.1、 进入new JobWaiter(this, jobId, partitions.size, resultHandler)方法
3.1.2、进入eventProcessActor ! JobSubmitted( jobId, rdd, func2, partitions.toArray, allowLocal, callSite, waiter, properties)方法
我们可以看出来,是给自己发消息的
3.1.3、进入 dagScheduler.handleJobSubmitted(jobId, rdd, func, partitions, allowLocal, callSite,listener, properties)方法
首先构建finalStage,然后又一个getMissingParentsStages方法,可以发现运行有本地运行和集群运行两种模式,本地运行主要用于本地实验和调试:
3.1.3.1、进入 finalStage = newStage(finalRDD, partitions.size, None, jobId, callSite)方法:
3.1.3.2、进入 runLocally(job)方法:
3.1.3.2.1、 runLocallyWithinThread(job)方法:
3.1.3.3、进入 submitStage(finalStage)方法:
上面代码分析:submitStage第一次传入的参数是Job的最后一个Stage,然后判断一下是否缺失父Stage,如果没有依赖的parent Stage的话就可以submitMissingTasks运行,如果有parent Stage的话就要再一次submitStage做递归操作,最终会导致submitMissingTasks的调用:
3.1.3.3.1、进入 activeJobForStage(stage) 方法:
3.1.3.3.2、进入 getMissingParentStages(stage).sortBy(_.id) 方法:
跟进getShuffleMapState方法:
进入registerShuffleDependencies方法:
3.1.3.3.3、进入submitMissingTasks(stage, jobId.get) 方法:
PS:分析代码太多,下篇继续分析源码
相关推荐
标题:“Spark RDD API”说明了本文档将专注于Apache Spark中弹性分布式数据集(RDD)的API。RDD是Spark的核心概念,它是一个容错的、并行的数据结构,使得用户能够处理大数据集。本文档将基于Scala语言中的RDD实现...
- RDD(弹性分布式数据集):Spark的基础数据结构,是不可变、分区的数据集合,可以在集群中并行操作。 - DataFrame:Spark SQL引入的数据模型,它是基于表和列的抽象,提供了更高级别的抽象和优化。 - Dataset:...
Spark Streaming则构建在RDD之上,通过微批处理实现对实时数据流的处理,支持复杂的窗口操作和状态管理。这对于实时监控、在线分析等应用场景非常有用。 MLlib是Spark的机器学习库,包含了多种算法如分类、回归、...
《Spark编程核心组件:spark-assembly-1.5.2-hadoop2.6.0.jar详解》 在大数据处理领域,Spark以其高效、易用和灵活性脱颖而出,成为了许多开发者的首选框架。Spark-assembly-1.5.2-hadoop2.6.0.jar是Spark中的一个...
转换创建新的RDD,而动作触发实际的计算并可能返回结果到驱动程序或存储数据。 **2. Spark组件** - **Spark Core**:Spark的基础架构,提供了任务调度、内存管理、错误恢复和网络通信等功能。 - **Spark SQL**:...
此外,Spark 还提供了SQL查询支持(通过Spark SQL),流处理(Spark Streaming),机器学习库(MLlib)以及图形处理(GraphX)等功能,使其成为全方位的大数据处理平台。 在Spark 3.1.3中,可能包含以下关键改进和...
(2) 行动操作,RDD的行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如count()和first()。 惰性求值:RDD的转化操作是惰性求值的,即在被调用行动操作之前Spark不会开始计算,...
在Spark 2.2.2中,除了基本的RDD接口,还引入了DataFrame和Dataset,它们提供了一种更高级的、类型安全的数据处理方式,使得开发人员能够更方便地进行SQL查询和复杂的数据分析。 Spark 2.2.2支持多种数据源,包括...
1. **Spark**: Spark的核心在于它的弹性分布式数据集(RDD),这是一个容错的内存计算模型。它提供了一组高级APIs,支持批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)和机器学习(MLlib)等多种...
1. **弹性分布式数据集(RDD)**:RDD是Spark的基本数据抽象,它是不可变、分区的记录集合,可以在集群中并行操作。RDD提供了高效的转换(transformations)和动作(actions)操作。 2. **内存计算**:Spark通过将...
2. **Resilient Distributed Datasets (RDD)**:RDD是Spark的基本数据结构,它是不可变、分区的元素集合,能够在集群中的节点上分布式存储。 3. **弹性**:Spark提供了容错机制,当工作节点失败时,可以自动恢复丢失...
Spark-assembly-1.5.2-hadoop2.6.0.jar是Apache Spark的一个关键组件,主要用于在Scala环境中开发Spark应用程序。这个特定的版本(1.5.2)与Hadoop 2.6.0兼容,这意味着它可以无缝地运行在支持Hadoop 2.6.0的集群上...
Spark是Apache软件基金会下的一个开源大数据处理框架,它以其高效、灵活和易用性而闻名。Spark 2.1.1是该框架的一个稳定版本,它在2.1.0的基础上进行了一些改进和修复,提供了更好的性能和稳定性。这个特定的压缩包...
此外,Spark的弹性分布式数据集(Resilient Distributed Datasets, RDD)是其核心概念,它提供了一种在内存中处理数据的方式,大大提升了计算效率。Spark 1.6.0还引入了DataFrame,进一步优化了数据处理性能,简化了...
用户可以通过并行操作对RDD进行计算,且RDD之间的转换都是延迟执行的,直到需要结果时才真正计算,这种机制称为惰性计算。 2. **内存计算**:Spark的一大优势在于其内存计算模型,它将数据缓存在内存中,减少了磁盘...
转换创建新的RDD,而动作触发计算并可能返回结果到驱动程序或写入外部存储。 2. **Spark组件**: - **Spark Core**:基础执行引擎,负责任务调度、内存管理、故障恢复等。 - **Spark SQL**:提供SQL和DataFrame/...
1. **Spark核心概念**:Spark的核心组件是弹性分布式数据集(Resilient Distributed Datasets, RDD),这是一种容错的、不可变的数据集合,可以在集群中的多个节点上并行操作。此外,Spark还提供了DataFrame和...
在 Spark 2.4.0 版本中,RDD 已经相当成熟,提供了丰富的操作接口,如转换(transformations)和行动(actions)。 Spark SQL 是 Spark 处理结构化数据的重要组件,它允许用户通过 SQL 或者 DataFrame/Dataset API ...
RDD操作可以是转换(transformations),如map和filter,或者行动(actions),如count和saveAsTextFile。转换创建新的RDD,而行动会触发计算并返回结果到驱动程序或保存到外部存储。 在测试和个人使用环境中,...