SPark关于缓存&坑
SPark基本概念
对于Spark有一定了解的童鞋可以跳过前面基础概念的讲解,直接从下面的缓存部分开始看↓↓↓
Spark执行流程
Spark在执行Transformation类型操作时都不会立即执行,当遇到Action类型操作时,就会触发计算,每个action操作都会触发runJob操作,生成一个Job.在Driver中SparkContext根据RDD之间的依赖关系创建出DAG(有向无环图),DAGScheduler负责解析这个DAG,从当前Action方法向前回溯,如果遇到的是窄依赖则应用流水线优化,继续向前找,当碰到一个宽依赖时,就会把这个宽依赖之前的RDD组装成一个stage,再从当前宽依赖开始继续向前找,重复刚才的步骤,以此类推.每个stage由可以并发执行的一组task构成,一个partition对应一个task.DAGScheduler将stage划分完后,会将这组task提交到TaskScheduler去执行,任务会在Executor进程的多个Task线程上执行,完成Task任务后 将结果信息提交到ExecutorBackend中 他会将信息提交给TaskScheduler,TaskScheduler接到消息后通知TaskManager,移除该Task任务,开始执行下一个任务.TaskScheduler同时会将信息同步到TaskSet Manager中一份,全部任务执行完毕后TaskSet Manager将结果反馈给DAGScheduler,如果属于ResultTask 会交给JobListener.否则话全部任务执行完毕后写入数据.
Spark运行架构的特点
每个Application获取专属的Executor进程,该进程在Application期间一直驻留,并以多线程方式运行tasks。这种Application隔离机制有其优势,无论是从调度角度看(每个Driver调度它自己的任务),还是从运行角度看(来自不同Application的Task运行在不同的JVM中)。当前,这也意味着SparkApplication不能跨应用程序共享数据,除非将数据写入到外部存储系统。
几个名词解释
-
Executor:
在启动Spark程序时会指定num-executors executor数量,每个executor在yarn上就是一个container 也就是一个JVM
通过executor-memory指定JVM内存大小
而启动的一个Spark程序就是一个Application -
Job
Spark是通过action算子触发真正的计算,每一个action操作会对应一个Job
下面就是一个Application中的18个Job,也就是对应代码中的18个action操作
-
Stage
如上面所说的,在每个Job中从当前Action方法向前回溯,如果遇到的是