zoukankan      html  css  js  c++  java
  • 【Spark】源码分析之RDD的生成及stage的切分

    一、概述

    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


  • 相关阅读:
    vs2015解决fopen、fscanf 要求替换为fopen_s、fscanf_s的办法
    ThinkPHP5.1的公共函数
    Linux禁止ping
    2019.10.17 上科大虞晶怡教授
    Minimax极大极小算法、Alpha-Beta Pruning剪枝算法
    Apache24服务无法启动,发生服务特定错误1.
    LaTeX小白安装超详细步骤(WIndows系统)||相信我看这个安装就够啦!
    Java中Comparator比较器的使用
    当我看到别人二战想法,退缩的时候,我的感受
    2019.12.3 学英语的心得;学习学习
  • 原文地址:https://www.cnblogs.com/snova/p/9195694.html
Copyright © 2011-2022 走看看