大数据框架之Spark

spark集群组成及执行流程

一. spark集群组成
大数据框架之Spark_第1张图片
Spark集群由集群管理器(Cluster Manager)、工作节点(Worker)、执行器(Executor)、驱动器(Driver)、应用程序(Application)等部分组成。
1、Driver:该进程执行Spark程序的 main 方法, 负责实际代码的执行工作。
1)启动 SparkContext或SparkSession,将用户程序转化为作业(Job);
2)在 Executor 之间调度任务(Task);
3)跟踪 Executor 的执行情况;
4)通过 UI 展示查询运行情况;

2、Cluster Manager:该进程负责对整个集群资源的分配与管理,不负责对 Executor 的资源的分配.
1)常见的集群管理工具有Yarn、Mesos、Kubernetes、Standalone
2)在YARN部署模式下为ResourceManager

3、Worker: 负责启动和管理 Executor,在YARN部署模式下为NodeManager

4、Executor:负责执行具体的任务,Executor运行在Executor Backend容器中,一个Executor Backend有且仅有一个 Executor对象。
1)向Driver认领属于自己的任务,接收任务后负责运行Spark Task,并将结果返回给Driver
2)通过自身的Block Manager为用户程序中要求缓存的 RDD 提供内存式存储。

二、Spark整体执行流程:

DAGScheduler:用来把一个 Job 根据RDD之间的依赖关系划分为多个Stage,在划分stage时,最后一个Stage是ResultStage,前面所有的stage被称为ShuffleMapStage,ShuffleMapStage的结束,伴随着shuffle文件的写磁盘

TaskScheduler:将TaskSet提交给Worker运行,每个Executor运行什么Task就是在此处分配的。
大数据框架之Spark_第2张图片
1、整体执行流程

1)用户将spark程序提交给Driver,Driver负责运行spark程序的main方法,创建SparkContext,SparkContext根据RDD的依赖关系生成逻辑执行图

2)当执行到action算子会请求DAGScheduler,DAGScheduler会先创建一个Job ,然后对job进行切分,根据RDD的依赖关系划分为多个Stage(每个Stage对应一个Taskset,TaskSet中Task的个数由 Stage中的最大分区数决定)

3)DAGScheduler请求TaskScheduler调度这些Taskset,TaskScheduler先去询问集群中有多少资源,资源通过SchedulerBackend返回

4)TaskScheduler 会通过 ClusterManager 将 Task 调度到 Executor 上执行,先调度ShuffleMapTasks,再去调度ResultTasks。

5)ResultTasks执行结束,将执行结果汇报给Driver。

2、逻辑执行图

逻辑执行图描述一组RDD及依赖关系,也就是数据如何流动,如何计算(数据处理和存储的过程表达)

查看:RDD.toDebugString

1)RDD逻辑图边界:从第一个RDD的创建开始到Action算子执行之前结束

2)RDD如何生成:继承RDD实现RDD的五大属性来提供自己的特有功能

  • HadoopRDD:重写分区列表(HadoopRDD对应HDFS文件block),重写计算函数(通过计算函数读取block)
  • MapPartitionRDD:重写计算函数(处理整个RDD的数据)

3)RDD依赖关系的判断依据

  • 如果分区间一对一是窄依赖,
  • 如果分区间是多对一,要看是否有数据分发,也就是看是否有shuffle

4)窄依赖(NarrowDependency)的类别

  • OneToOneDependency
  • RangeDependency: union算子

多对一窄依赖:重分区算子coalesce

宽窄依赖的核心区别是: 窄依赖的RDD可以放在一个 Task 中运行

3、物理执行图

物理执行图描述的是RDD流程生成以后, 如何计算和运行的问题,也就是如何把RDD放在集群中执行的问题

1)如何划分Stage ?
大数据框架之Spark_第3张图片

  • 从最后一个 RDD, 也就是逻辑图中最右边的 RDD 开始, 向前滑动 Stage 的范围, 为 Stage0
  • 遇到 ShuffleDependency 断开 Stage, 从下一个 RDD 开始创建新的 Stage, 为 Stage1
  • 新的 Stage 按照同样的规则继续滑动, 直到包裹所有的 RDD

4、如何运行

1)job和Stage的关系:

一个Job有多个stage,Stage之间是串行的,Stage 之间的边界由 Shuffle 操作来确定

  • Stage 内的 RDD 之间都是窄依赖, 可以放在一个管道中执行
  • Shuffle 后的 Stage 需要等待前面 Stage 的执行

Stage 有两种

  • ShuffMapStage, 其中存放窄依赖的 RDD
  • ResultStage, 每个 Job 只有一个, 负责计算结果, 一个 ResultStage 执行完成标志着整个Job 执行完毕

2)StageTask的关系

  • 一个 Stage 就是一组并行的 Task 集合
  • Task 是 Spark 中最小的独立执行单元, 其作用是处理一个 RDD 分区
  • 一个 Task 只可能存在于一个 Stage 中, 并且只能计算一个 RDD 的分区

3)TaskSet

  • 一个 Stage 有一个 TaskSet
  • TaskSetTask 的个数由 Stage 中的最大分区数决定

总结:Job > Stage > Task,Job 中包含 Stage 中包含 Task

你可能感兴趣的:(spark)