spark学习笔记(一)基础

参考链接

https://www.jianshu.com/p/3aa52ee3a802
https://www.cnblogs.com/Mayny/p/9330436.html
https://www.cnblogs.com/tgzhu/p/5818374.html

计算框架

spark学习笔记(一)基础
Spark架构采用了分布式计算中的Master-Slave模型,Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。
Master作为整个集群的控制器,负责整个集群的正常运行;Worker相当于是计算节点,接收主节点命令与进行状态汇报;Executor负责任务的执行;Client作为用户的客户端负责提交应用,Driver负责控制一个应用的执行。

  • Driver:运行Application的main()函数并创建SparkContext。
  • SparkContext:整个应用的上下文,控制应用的生命周期。
  • Cluster Manager:指的是在集群上获取资源的外部服务。目前有三种类型:
    1、Standalon : spark原生的资源管理,由Master负责资源的分配
    2、Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架
    3、Hadoop Yarn: 主要是指Yarn中的ResourceManager
  • Worker:从节点,负责控制计算节点,启动Executor或者Driver。在YARN模式中为NodeManager,负责计算节点的控制。
  • Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executor。
  • Task:被分配到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责。

运行流程

spark学习笔记(一)基础

  1. 构建Spark Application的运行环境,启动SparkContext
  2. SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend,
  3. Executor向SparkContext申请Task
  4. SparkContext将应用程序分发给Executor
  5. SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行
  6. Task在Executor上运行,运行完释放所有资源。

任务划分过程

spark学习笔记(一)基础

  • Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成,一个Application中往往会产生多个Job。

  • Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方。

  • DAG: DAGScheduler根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图,各个RDD之间存在着依赖关系,这些依赖关系形成该Job的有向无环图DAG)

  • DAGScheduler:通过RDD之间的依赖的关系找出划分Stage开销最小的调度方法。简单来说,从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分(当遇到宽依赖时因需要进行shuffle操作,这涉及到了不同Partition之间进行数据合并,故以此为界划分不同的Stage)。完成了Stage的划分。随后DAGScheduler基于每个Stage生成TaskSet,并将TaskSet提交给TaskScheduler。TaskScheduler 负责具体的task调度,在Worker节点(交给work节点上的Executor)上启动task。划分stage如下图
    spark学习笔记(一)基础

  • TaskSedulter: 将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的. TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。
    在不同运行模式中任务调度器具体为:

  • Spark on Standalone模式为TaskScheduler

  • YARN-Client模式为YarnClientClusterScheduler

  • YARN-Cluster模式为YarnClusterScheduler
    下图展示了TaskScheduler的作用
    spark学习笔记(一)基础

  • Job-Stage-Task之间的关系

  1. 一个Spark程序可以被划分为一个或多个Job,划分的依据是RDD的Action算子,每遇到一个RDD的Action操作就生成一个新的Job。
  2. 每个spark Job在具体执行过程中因为shuffle的存在,需要将其划分为一个或多个可以并行计算的stage,划分的依据是RDD间的依赖关系。
  3. 每个stage中可能存在多个Task,这些Task执行相同的程序逻辑,只是它们操作的数据不同。一般RDD的一个Partition对应一个Task,Task可以分为ResultTask和ShuffleMapTask。
    Job-Stage-Task之间的关系如下图所示
    spark学习笔记(一)基础