Spark作业运行在SparkContext中,作业包含若干个Stages,构成一个DAG。Spark作业运行的高层抽象是一个driver实体,和若干Executor实体。Driver托管SparkContext,Executor执行具体的任务。
基本运行流程
从流程上来看,一个Spark job按照以下阶段运行:
- 构建SparkContext
- DAGScheduler负责将job分解成若干Stage,共同构成一个DAG
- TaskScheduler负责把每个阶段的任务提交到集群。将每个task找到一个最合适的Executor上运行。运行完了再分配下一个。每个task一个cpu核。
- 这些take通过调度程序后端启动,其向executor后端分发任务,命令启动。
在某个task失败之后,TaskScheduler把这个task发给另外一个Executor重新启动。
DAG具体是如何构建的呢?Spark将任务分成两种:
- shuffle map任务,其实就是转化操作,任务在一个rdd上计算,将结果输出到一个新分区上去,以待后面取用。
- result任务,运行在最终Stage,每个分区把其上的rdd进行计算,结果返回给driver。
另外DAG还会为每个任务设置一个位置偏好,例如hdfs node local,或者缓存的rdd,process local
Executor和Cluster Manager
Cluster Manager负责管理每个Executor的生命周期,配有多种选项。
- local模式。 本机运行,driver和executor在同一个JVM中。local[*],local[n]等等分配内核线程。
- 独立模式。分布式实现。有1个master和多个worker。spark://host:port
- Mesos模式。
- Yarm模式。分布式实现。每个Executor在一个Yarn Container中运行。yarn-client/yarn-cluster。
Spark on Yarn
yarn-client
当driver构建SparkContext实例时,就启动了与Yarn之间的交互。
- Spark首先向Yarn RM提交了一个应用;
- RM找到一个NM,启动一个Container,在其上运行一个名为SparkExecutorLauncher的AM
- 这个AM向RM申请资源,然后向申请到的NM发出启动Container命令,这个Container进程称为ExecutorBackend。
- 每个Executor启动时连接回SparkContext,注册自身。因此SparkContext也获得了Executor信息。
yarn-cluster
client和cluster没有太大区别,性能上也相差无几。主要差别就是cluser模式的spark driver是后启动的,在AM被分配好后才会启动driver。
网友评论