Spark内核架构原理

1.Driver

选spark节点之一,提交我们编写的spark程序,开启一个Driver进程,执行我们的Application应用程序,也就是我们自己编写的代码。Driver会根据我们对RDD定义的操作,提交一大堆的task去Executor上。Driver注册了一些Executor之后,就可以开始正式执行我们的Spark应用程序了,首先第一步,创建初始RDD,读取数据。HDFS文件内容被读取到多个Worker节点上,形成内存中的分布式数据集,也就是初始RDD。

2.Master

是一个进程,主要负责资源的调度和分配,还有集群的监控等职责。

3.Worker

由我们spark配置文件slave决定,它是一个进程。主要负责两个,一个是自己内存存储的RDD的某个partition ;另一个是启动其他进程和线程,对RDD上的partition 进行并行的处理和计算。

4.Executor

Worker会为应用程序启动Executor,Executor是一个进程。Executor启动之后,会向Driver进行反注册,这样,Driver就知道,哪些Executor是为它服务的了。Executor接收到task之后,会启动多个线程来执行task。

5.Task

Executor会为应用程序启动Task线程,Executor和Task其实就是执行负责执行,对RDD的partition 进行并行的计算了,也就是执行我们对RDD定义的,比如map,flatMap,reduce等算子操作。task会对RDD的partition数据执行指定的算子操作,形成新的RDD的partition。Task有两种:ShuffleMapTask和ResultTask,只有最后一个stage 是ResultTask,之前的stage都是ShuffleMapTask。

Spark架构深度剖析

  我们有一个Spark应用程序(Application)选择一台安装了spark的节点作为client,当我们通过spark-submit结合shell提交Application就会在client中启动一个Driver进程。spark-submit使用我们之前一直使用的那种提交模式去提交的时候,我们之前的提交模式叫做standalone,其实会通过反射的方式,创建一和构造一个DriverActor进程出来。

  Driver进程启动之后,会做一些初始化的操作,我们在编写的spark应用时第一行就是先构造 SparkConf,再构造 SparkContext。SparkContext 在初始化的时候,做的最重要的两件事是,就是构造出来 DAGScheduler 和 TaskScheduler。

  TaskScheduler 实际上会负责通过它对应的一个后台进程去连接spark集群上的 Master 节点,向Master注册Application。说白了就是让Master 知道,有一个新的Spark应用程序要运行。

  Master在接受到Spark应用程序(Application)的注册申请之后,会通过自己的资源调度算法,会发送请求给在spark集群的 Worker,为这个 Application 启动多个 Executor。为该应用程序进行资源的调度和分配,资源分配就是 Executor 的分配。

  Worker 接收到 Master 的请求之后,会为 Spark 应用(Application)启动 Executor。Executor干的第一件事情是,Executor启动之后会自己反向注册到 TaskScheduler 上,这样,TaskScher 就知道,哪些Executor是为它服务的了。所有Executor都反向注册到 Driver 上之后,Driver 结束 SparkContext 初始化,会继续执行我们的代码。

  每执行到一个action,就会创建一个job,把job提交给DAGScheduler。DAGScher会将job划分为多个stage,然后每个stage创建一个TaskSet,每个 TaskSet 给 TaskScheduler 。

  TaskScheduler 会把TaskSet里每一个Task提交到Executor上执行(task分配算法)。

  Executor每接收到一个Task,都会用TaskRunner来封装Task,然后从线程池里取出一个线程,执行这个Task。TaskRunner将我们编写的代码,也就是要执行的算子以及函数,拷贝,反序列化,然后执行Task。Task有两种:ShuffleMapTask和ResultTask,只有最后一个stage 是ResultTask,之前的stage都是ShuffleMapTask。

  所以,最后整个spark应用程序的执行,就是stage分批次作为TaskSet提交到Executor执行,每个task针对RDD的一个partition,执行我们定义的算子和函数,以此类推,直到所有的操作执行完为止。

最新文章

  1. xilium CefGlue集成包
  2. 【leetcode】Integer to Roman
  3. 【Spark】---- 在Linux集群上安装和配置Spark
  4. (二)、NodeJS 、Express4安装使用方法
  5. ActiveMQ学习笔记(二) JMS与Spring
  6. 【转】 C++中如何在一个构造函数中调用另一个构造函数
  7. CENTOS6 下MATLAB2014b的安装和破解(Matlab_R2014b linux版 安装笔记)
  8. centos安装GO
  9. [Egret]长按图片分享、分享图片、本地存储
  10. API接口通讯参数规范(2)
  11. 安装vmware-tools遇the path "" is not valid path to the gcc binary和the path "" is not a valid path to the 3.10.0-327.e17.x86_64 kernel headers问题解决
  12. 【Python基础】lpthw - Exercise 41 学习面向对象术语
  13. 目标检测模型的性能评估--MAP(Mean Average Precision)
  14. 大数据入门第二十天——scala入门(一)入门与配置
  15. supperset (python 2.7.12 + mysql)记录
  16. [leetcode]Gas Station @ Python
  17. gh-ost安装
  18. Hive 建外链表到 Hbase(分内部表、外部表两种方式)
  19. 【性能测试】:关于loadrunner11录制Chrome浏览器脚本的方法
  20. An In-Depth Look at the HBase Architecture--转载

热门文章

  1. Android开发系列之系统源码目录
  2. Spring Boot从入门到实战:整合通用Mapper简化单表操作
  3. OpenGL/GLSL数据传递小记(2.x)(转)
  4. oracle中过滤中文字符或者汉字的函数
  5. 挑战--asp.net 文件夹上传
  6. 关于inittab的几个命令
  7. django学习总结
  8. 2.设计模式---Adapter模式
  9. 洛谷 P3674 小清新人渣的本愿
  10. 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam