手撕Spark之WordCount RDD执行流程

手撕Spark之WordCount RDD执行流程

文章目录

    • 手撕Spark之WordCount RDD执行流程
      • 写在前面
      • 软件环境
      • 代码
      • 过程分析

写在前面

一个Spark程序在初始化的时候会构造DAGScheduler、TaskSchedulerImpl、MapOutTrackerMaster等对象,DAGScheduler主要负责生成DAG、启动Job、提交Stage等操作,TaskSchedulerImpl主要负责Task Set的添加调度等,MapOutTrackerMaster主要负责数据的Shuffle等,这里不再赘述。

注意几个概念:

  • Application //一个Spark程序会有一个Application,也就拥有了唯一的一个applicationId
  • Job //调用Action 算子 触发runJob,触发一次runJob就会产生一个Job
  • Stage //遇到一次宽依赖就会生成一个Stage
  • Task //Spark程序运行的最小单元

注:一个Spark程序会有1个Application,会有1~N 个Job,会有1~N 个Stage,会有1~N 个Task

1 Application = [1 ~ N ] Job
1 Job = [ 1 ~ N ] Stage
1 Stage = [ 1 ~ N ] Task

软件环境

  • Spark:2.3.0

代码

写一个简单的WordCount计算代码

data.txt

hello world
hello java
hello scala
hello hadoop
hello spark

WCAnalyzer.scala


    //设置日志输出级别,便于观察日志
    Logger.getLogger("org.apache").setLevel(Level.ALL)

    //创建sc
    val sc = new SparkContext(new SparkConf().setMaster("local[1]")
    .setAppName("WCAnalyzer"))

    //从文件读取数据
    sc.textFile("data/data.txt", 1)
      //将数据按照空格进行切分(切分出单个单词)
      .flatMap(_.split(" "))
      //将每个单词和1组成一个Tuple
      .map((_, 1))
      //按照相同的单词进行聚合
      .reduceByKey(_ + _)
      //将聚合后的结果将(key,value)数据进行倒置 转换成(value,key)便于排序
      .map(v => (v._2, v._1))
      //按照聚合后的单词数量进行降序排序
      .sortByKey(false)
      //将排序后的数据进行倒置
      .map(v => (v._2, v._1))
      //将数据收集到driver
      .collect()
      //输出数据
      .foreach(println)

    //关闭sc
    sc.stop()
  }

过程分析

本代码只会生成一个Job,3个Stage,8个RDD。

  • 划分Stage

    Stage的划分要从后向前,每遇到一次宽依赖就划分一个Stage,因此这个简单的WC代码可以分为3个Stage,分别是由textFile、flatMap、map算子组成的第一个Stage 0;由reduceByKey、map算子组成的Stage 1;由sortByKey、map算子组成的Stage 2。

  • RDD的生成

    textFile(HadoopRDD [0] ,MapPartitionsRDD [1] ) //[ ] 内为该rdd的序号

    flatMap(MapPartitionsRDD [2] )

    map(MapPartitionsRDD [3] )

    reduceByKey(ShuffledRDD [4] )

    map(MapPartitionsRDD [5] )

    sortByKey(ShuffledRDD [6] )

    map (MapPartitionsRDD [7] )

  • 日志分析

    • org.apache.spark.SparkContext                     - St

你可能感兴趣的:(Spark,spark)