Spark中Driver和Executor的作用
Driver
Spark的驱动器节点,负责运行Spark程序中的main方法,执行实际的代码。Driver在Spark作业时主要负责:
- 将用户程序转化为作业(job)。
- 负责Executor之间的任务(task)调度。
- 监控Executor的执行状态。
- 通过UI展示运行情况。
Executor
- 运行Spark作业中具体的任务,并且将执行结果返回给Driver。
- 通过自身的块管理器(Block Manager)对用户要求缓存的RDD进行内存式存储。RDD式缓存在Executor进程内部的,这样任务在运行时可以充分利用缓存数据加速运算。
Application Job Stage Task
(1) Application
spark-submit 提交的一个spark任务
(2) Job
spark job是根据action算子触发的,遇到action算子就会起一个job
Simply put, a Spark Job is a single computation action that gets instantiated to complete a Spark Action. A Spark Action is a single computation action of a given Spark Driver.
(3) Stage
stage的划分依据就是看是否产生了shuflle(即宽依赖),遇到一个shuffle操作就划分为前后两 个stage
(4) Task
它是 stage 的子集,以分区数来衡量,分区数多少,task 就有多少
Action Transformer
- Transformer是一个不需要实际执行,外部用户无感知的操作
- Action是一个数据计算执行操作
宽依赖和窄依赖
- 窄依赖 指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区(O(1),与数据规模无关)
- 宽依赖 指父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区(O(n),与数据规模有关)
Spark为什么比MR快
- DAG 相比Hadoop的MapReduce 在大多数情况下可以减少IO次数。 DAG可以连续shuffle,也就是DAG可以包含多个MapReduce操作,不用每次Map后落盘。
- Spark shuffle优化。 MapReduce在shuffle时默认进行排序,Spark在Shuffle时则只有部分场景才排序(bypass机制不排序 groupby就是bypass),排序是非常耗时的,这样可以加快shuffle的速度。
- Spark 支持将反复使用的数据进行缓存。 checkpoint 机制
- 任务级别并行度上的不同。 MapReduce采用了多进程模型,而Spark采用的多线程模式。MapReduce的MapTask 和ReduceTask都是进程级别,都是jvm进程,每次启动都要重新申请资源,消耗不必要的时间;而SparkTask是基于线程的模型,通过复用线程池中的线程来减少启动和关闭Task的资源消耗
ByPass机制
内存管理
Spark集群会启动Driver和Executor两种JVM进程,前者为主控进程,后者负责执行具体的计算任务。由于Driver的内存管理相对简单,本文主要对Executor的内存管理进行分析,下文中的Spark内存均特指Executor的内存。