Spark入门指南:从基础概念到实践应用全解析( 三 )


如果Stage能够复用前面的Stage的话,那么会显示灰色 。

Spark入门指南:从基础概念到实践应用全解析

文章插图
9.Shuffle在 Spark 中 , Shuffle 是指在不同阶段之间重新分配数据的过程 。它通常发生在需要对数据进行聚合或分组操作的时候,例如 reduceByKey 或 groupByKey 等操作 。
在 Shuffle 过程中,Spark 会将数据按照键值进行分区 , 并将属于同一分区的数据发送到同一个计算节点上 。这样,每个计算节点就可以独立地处理属于它自己分区的数据 。
10.Stage的划分Stage的划分,简单来说是以宽依赖来划分的 。
对于窄依赖 , Partition 的转换处理在 Stage 中完成计算,不划分(将窄依赖尽量放在在同一个 Stage 中,可以实现流水线计算) 。
对于宽依赖 , 由于有 Shuffle 的存在,只能在父 RDD 处理完成后,才能开始接下来的计算,也就是说需要划分 Stage 。
Spark 会根据 Shuffle/宽依赖 使用回溯算法来对 DAG 进行 Stage 划分,从后往前,遇到宽依赖就断开,遇到窄依赖就把当前的 RDD 加入到当前的 Stage 阶段中 。
至于什么是窄依赖和宽依赖 , 下文马上就会提及 。
11.窄依赖 & 宽依赖(1) 窄依赖
父 RDD 的一个分区只会被子 RDD 的一个分区依赖 。比如:map , filter和union,这种依赖称之为「窄依赖」 。
Spark入门指南:从基础概念到实践应用全解析

文章插图
窄依赖的多个分区可以并行计算,并且窄依赖的一个分区的数据如果丢失只需要重新计算对应的分区的数据就可以了 。
(2) 宽依赖
指子RDD的分区依赖于父RDD的所有分区,称之为「宽依赖」 。
Spark入门指南:从基础概念到实践应用全解析

文章插图
对于宽依赖 , 必须等到上一阶段计算完成才能计算下一阶段 。
12.DAG有向无环图,其实说白了就是RDD之间的依赖关系图 。
  • 开始:通过 SparkContext 创建的 RDD 。
  • 结束:触发 Action,一旦触发 Action 就形成了一个完整的 DAG(有几个 Action , 就有几个 DAG) 。
三、Spark执行流程Spark的执行流程大致如下:
  • 构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源 。
  • 资源管理器为Executor分配资源并启动Executor进程,Executor运行情况将随着“心跳”发送到资源管理器上 。
  • SparkContext构建DAG图,将DAG图分解成多个Stage , 并把每个Stage的TaskSet(任务集)发送给Task Scheduler (任务调度器) 。
  • Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor,同时,SparkContext将应用程序代码发放给Executor 。
  • Task在Executor上运行,把执行结果反馈给Task Scheduler,然后再反馈给DAG Scheduler 。
  • 当一个阶段完成后,Spark 会根据数据依赖关系将结果传输给下一个阶段,并开始执行下一个阶段的任务 。
  • 最后 , 当所有阶段都完成后,Spark 会将最终结果返回给驱动程序,并完成作业的执行 。
四、Spark运行模式Spark 支持多种运行模式 , 包括本地模式、独立模式、Mesos 模式、YARN 模式和 Kube.NETes 模式 。