Spark 程序的执行过程

本贴最后更新于 2702 天前,其中的信息可能已经时移世异

Spark 任务提交执行流程

spark 任务执行流程
Spark 的作业提交及任务执行流程中就介绍了一个任务从提交到集群是如何执行的(如上图),其中最重要的是启动 Driver,Executor,和 Task.Driver 负责给 Executor 分配 Task 执行。下面看一看一个任务是如何变为一个个 Task 被 Executor 执行的。

Spark 程序执行计划

仍然以 wordCount 为例,

val linesRDD = sc.textFile("input/words")
val wordsRDD = lines.flatMap((line) =>line.split(" "))
val pairsRDD = words.map(word =>(word,1))
val wordCountsRDD = pairs.reduceByKey(_+_).sortByKey(); 
wordCounts.foreach(wordcount =>println(wordcount._1+" - "+wordcount._2))

生成逻辑执行计划(logical execution plan)

上面的程序在执行的过程中会产生很多的 RDD,这些 RDD 之间会形成一种依赖关系,我们把生成的依赖关系图叫做逻辑查询计划。wordCountsRDD 依赖 pairsRDD,pairsRDD 依赖 wordsRDD,wordsRDD 依赖 linesRDD,最终执行 action 的时候触发任务的执行,这个执行过程是一个回溯的过程,foreach 操作会一步步向前找到数据来源开始执行直到得到 wordCountsRDD,然后将其输出。逻辑执行计划是 RDD 的 Transformations 函数的 DAG。
7d76f1cf704745a29a2d40cdf11d30bf.png

生成物理执行计划(physical execution plan)

在生成逻辑查询计划之后,会根据具体的数据,进行分区,stage 划分,每个 stage 的 task 的划分。物理执行计划是 stage 的 DAG.
partition 划分:
8c235af639804debae57213359c42c36.png
Stage 划分:stage的划分算法,主要是取决于宽依赖和窄依赖.一个 Partition 依赖于一个 partition 这种依赖关系叫做窄依赖,一个 paritition 依赖于多个 paritition 就是宽依赖,宽依赖是Shuffle操作产生的。
2a9c4d8fc8524b8ba64e94d1b7ded075.png
Task 划分:Driver 会把每个 stage 划分成多个 Task.这些 task 之间也会有依赖关系,所以 task 的执行也是有先后顺序的。Driver 序列化 task 并按顺序调度每个 task 到 Executor 上执行。
d624501cef0c4428a4c7b2fd084e9a1d.png

  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 560 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
rzx
此生最怕深情被辜负,最怕兄弟成陌路。对世界充满善意,同时又充满深深的恨意,我渴望天降甘霖福泽众生,又渴望灭世洪水重创世纪。 广州