1、构建Spark Application运行环境;
在Driver Program中新建SparkContext(包含sparkcontext的程序称为Driver Program);
Spark Application运行的表现方式为:在集群上运行着一组独立的executor进程,这些进程由sparkcontext来协调;
2、SparkContext向资源管理器申请运行Executor资源,并启动StandaloneExecutorBackend,executor向sparkcontent申请task;
集群通过SparkContext连接到不同的cluster manager(standalone、yarn、mesos),cluster manager为运行应用的Executor分配资源;一旦连接建立之后,Spark每个Application就会获得各个节点上的Executor(进程);每个Application都有自己独立的executor进程;Executor才是真正运行在WorkNode上的工作进程,它们为应用来计算或者存储数据;
3、SparkContext获取到executor之后,Application的应用代码将会被发送到各个executor;
4、SparkContext构建RDD DAG图,将RDD DAG图分解成Stage DAG图,将Stage提交给TaskScheduler,最后由TaskScheduler将Task发送给Executor运行;
5、Task在Executor上运行,运行完毕后释放所有资源;
Spark运行架构特点:
1、每个Application获取专属的executor进程,该进程在Application运行期间一直驻留,并以多线程方式运行tasks;这种Application隔离机制优势在于,无论是从调度角度看(每个Driver调度它自己的任务),还是从运行角度看(来自不同Application的Task运行在不同的JVM中)。当然,这也意味着Spark Application不能跨应用程序共享数据,除非借助于外部存储系。比如:Tachyon、SharkServer;
2、spark并不关心底层用什么cluster manager在运作,它只关心是否能拿到executor并能保持相互通信即可,因为最终的Task是运行在executor上;
3、让你的driver program尽量靠近worker(运行executor节点),最好在同一个机架中。因为Application运行过程中SparkContext和Executor之间有大量信息交互;如果想在远程集群中运行,最好采用RPC将Application提交给集,不要远离worker运行application;
4、Task采用了数据本地性和推测执行的优化机制;
详见 http://spark.apache.org/docs/latest/cluster-overview.html