Spark运行模式

**

Spark运行模式

**
一、 Spark运行架构介绍
术语定义:
Application:指的是用户编写的Spark应用程序,包含了一个Driver功能的代码和分布在集群中多节点上运行的Executor代码。
Driver:Spark中的Driver就是运行Application的main()函数,并且创建SparkContext。SparkContext为Spark准备运行环境,它负责和ClusterManager通信,进行资源的申请、任务的分配和监控,当Executor部分运行完毕后,负责将SparkContext关闭。
Worker:集群中运行Application代码的节点。
Executor:Application运行在Worker节点上的一个进程,该进程负责运行Task。
Cluster Manager:在集群上获取资源的外部服务。
作业(Job):包含多个Task组成的并行计算,job包括多个RDD以及作用于RDD上的各种操作。
阶段(Stage):每个Job会被拆分成很多组Task,每组任务被称为Stage。
任务(Task):被送到某个Executor上的工作任务。
Spark运行基本流程图
这里写图片描述
1、 构建Spark Application的运行环境,启动SparkContext,SparkContext向资源管理器注册并且申请运行Executor资源;
2、 资源管理器分配Executor资源并启动ExecutorBackend,Executor运行情况将随着心跳发送到资源管理器;
3、 SparkContext构建DAG图,将DAG图分解成Stage,并把TaskSet发送给Task Scheduler。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行同时将SparkContext将应用程序代码发放给Executor;
4、 Task在Executor上运行,运行完毕释放所有资源;
DAGScheduler
DAGSchuduler把一个Spark作业换成Stage的DAG,根据RDD和Stage之间的关系找出开销最小的调度方法,然后把Stage以TaskSet的形式提交给TaskScheduler。
TaskScheduler
TaskScheduler维护所有的TaskSet,当Executor向Driver发送心跳时,TaskScheduler会根据其资源剩余情况分配相应的Task。
Job、Stage、Task
这里写图片描述

这里写图片描述
通过观察,这段代码,只有一个job,两个stage,有66个task。
详细介绍一下job、stage、task
job:所谓一个 job,就是由一个 rdd 的 action 触发的动作,可以简单的理解为,当你需要执行一个 rdd 的 action 的时候,会生成一个 job。
stage : stage 是一个 job 的组成单位,就是说,一个 job 会被切分成 1 个或 1 个以上的 stage,然后各个 stage 会按照执行顺序依次执行。至于 job 根据什么标准来切分 stage,下几节我们再介绍RDD的时候详细介绍。这里只是说一下,是按照窄依赖和宽依赖来切分的。
task:即 stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。从 web ui 截图上我们可以看到,这个 job 一共有 2 个 stage,66 个 task,平均下来每个 stage 有 33 个 task,相当于每个 stage 的数据都有 33 个 partition。
运行流程:
1、 Job: spark 应用里只有一个 job,那就是因为我们执行了一个 collect 操作,即把处理后的数据全部返回到我们的 driver 上。
2、 Stage:
这里写图片描述

第一个 stage,即截图中 stage id 为 0 的 stage,其执行了 sc.wholeTextFiles().map().flatMap().map().reduceByKey() 这几个步骤,因为这是一个 Shuffle 操作,所以后面会有 Shuffle Read 和 Shuffle Write。具体来说,就是在 stage 0 这个 stage 中,发生了一个 Shuffle 操作,这个操作读入 22.5 MB 的数据,生成 41.7 KB 的数据,并把生成的数据写在了硬盘上。
第二个 stage,即截图中 stage id 为 1 到 stage,其执行了 collect() 这个操作,因为这是一个 action 操作,并且它上一步是一个 Shuffle 操作,且没有后续操作,所以这里 collect() 这个操作被独立成一个 stage 了。这里它把上一个 Shuffle 写下的数据读取进来,然后一起返回到 driver 端,所以这里可以看到他的 Shuffle Read 这里刚好读取了上一个 stage 写下的数据。
3、 Task:这里就不用介绍了。就是根据分区运行的task。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值