一、概述

Spark源码整体的逻辑(spark1.3.1):

从saveAsTextFile()方法入手

-->saveAsTextFile() 

--> saveAsHadoopFile() 

--> 封装hadoopConf,并传入saveAsHadoopDataset()方法

--> 拿到写出流SaprkHadoopWriter,调用self.context.runJob(self,writeToFile) 

--> runJob方法中,使用dagScheduler划分stage 

--> submitJob开始提交作业

-->任务处理器的post方法启动线程,获取队列中的任务,并调用onRecevie()方法提交任务

-->调用handleJobSubmitted,使用newStage中的getParentStage方法对stage进行切分 

-->getParentStage方法中,使用HashSet、Stack来存放stage和RDD,用栈来存储RDD主要是为了便于后面通过循环进行模式匹配,判断该RDD和父RDD的依赖关系,如果是宽依赖就会生成stage,如果是窄依赖,就会继续找父RDD

二、Spark源码详情

1. 在spark1.3.1的源码中,saveAsTextFile的关键代码在于它内部调用了saveAsHadoopFile()方法。

2. 进入到saveAsHadoopFile()方法中,首先spark会对配置信息进行封装,然后将配置信息传入saveAsHadoopDataset( )方法

3. saveAsHadoopDataset()方法中将会拿到Spark的写出流,并调用runJob方法准备开始提交作业。

4. 进入runJob方法中,会使用dagScheduler进行stage的切分

5. submitJob开始提交作业

6. 获取finalRDD的分区数,并调用任务处理器的post方法,循环取出数据放入队列中

7.  post方法中,将启动一个线程,将获取队列中的任务,并调用onRecevie()方法提交任务

8. 进入onReceive(),可以看到它是一个抽象类中的方法

9. 方法的实现在DAGScheduler中,对方法进行模式匹配。 匹配到任务提交的方法后,调用handleJobSumitted提交任务

10. handleJobSubmitted中,使用newStage中的getParentStage方法对stage进行切分

11. getParentStage方法中,使用HashSet、Stack来存放stage和RDD,用栈来存储RDD主要是为了便于后面通过循环进行模式匹配,判断该RDD和父RDD的依赖关系,如果是宽依赖就会生成stage,如果是窄依赖,就会继续找父RDD

【Spark】源码分析之RDD的生成及stage的切分的更多相关文章

  1. spark 源码分析之一 -- RDD的四种依赖关系

    RDD的四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和OneToOneDependency四种依赖关系.如 ...

  2. spark 源码分析之十九 -- DAG的生成和Stage的划分

    上篇文章 spark 源码分析之十八 -- Spark存储体系剖析 重点剖析了 Spark的存储体系.从本篇文章开始,剖析Spark作业的调度和计算体系. 在说DAG之前,先简单说一下RDD. 对RD ...

  3. Spark 源码分析系列

    如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...

  4. spark源码分析以及优化

    第一章.spark源码分析之RDD四种依赖关系 一.RDD四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和O ...

  5. Spark源码分析 – DAGScheduler

    DAGScheduler的架构其实非常简单, 1. eventQueue, 所有需要DAGScheduler处理的事情都需要往eventQueue中发送event 2. eventLoop Threa ...

  6. Spark源码分析:多种部署方式之间的区别与联系(转)

    原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...

  7. Spark源码分析 – Shuffle

    参考详细探究Spark的shuffle实现, 写的很清楚, 当前设计的来龙去脉 Hadoop Hadoop的思路是, 在mapper端每次当memory buffer中的数据快满的时候, 先将memo ...

  8. Spark源码分析 – BlockManager

    参考, Spark源码分析之-Storage模块 对于storage, 为何Spark需要storage模块?为了cache RDD Spark的特点就是可以将RDD cache在memory或dis ...

  9. Spark源码分析 – SparkContext

    Spark源码分析之-scheduler模块 这位写的非常好, 让我对Spark的源码分析, 变的轻松了许多 这里自己再梳理一遍 先看一个简单的spark操作, val sc = new SparkC ...

随机推荐

  1. C++数组怎么复制

    C++数组怎么复制: #include <string.h>main(){int a[10]={34,56,4,10,77,51,93,30,5,52};int b[10];memcpy( ...

  2. pt-deadlock-logger使用

    死锁监控pt-deadlock-logger 首先我们要创建一个表用来保存死锁的信息: CREATE TABLE deadlocks ( server ) NOT NULL, ts timestamp ...

  3. SQL Server 有序GUID,SequentialGuid,

    问题描述 有序的GUID性能对比,堪比自增ID integer 一个大神告诉我NEWSEQUENTIALID() 在数据迁移的时候会有问题(感谢大神指点),所以我就深挖一下这个函数. 关于NEWSEQ ...

  4. Yii框架记录

    Yii框架记录 Yii 结构 使用yii开发一段时间,发现自身知其形不知其意,重温了下yii,理解框架,也可以梳理自己的知识库,借鉴成长,阶段性总结如下: 模型 模型是MVC模式中的一部分,是表现业务 ...

  5. redis外网连接的一些坑

    前言 在使用阿里云和腾讯云的redis 可以减少很大的维护量.但是在我们的业务场景中遇到了一个情况,阿里和腾讯的redis均不支持外网访问.因此,正好帮人解决一个问题,就拿出来分享一下. 阿呆的故事 ...

  6. 设计模式:仲裁者(Mediator)模式

    设计模式:仲裁者(Mediator)模式 一.前言     Mediator模式又称为仲裁者模式或者中介者模式,所起的作用是仲裁和中介,帮助其它类之间进行交流.在仲裁者模式之中,我们要明确两个概念,那 ...

  7. Cache及(HttpRuntime.Cache与HttpContext.Current.Cache)

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/avon520/archive/2009/11/25/4872704.aspx .NET中Cache有两种调用方式:Ht ...

  8. 五·管理mysql

    在上一篇文章中 四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码安装) 已经安装好了mysql,也正常启动了.本篇文章主要内容是管理m ...

  9. 系统剪切板的使用UIPasteboard

    最近发现支付宝和淘宝使用吱口令和淘口令的功能,就一直想怎么实现的,觉得应该是使用了系统的剪切板,然后查阅了资料做下笔记! 系统的剪切板主要是使用了UIPasteboard这个类. UIPasteboa ...

  10. 使用腾讯云mysql的一下小坑

    1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...