您的位置:首页 > 运维架构 > 网站架构

spark内核架构解密(13)

2016-05-02 18:10 375 查看
本期主要介绍下spark的内核架构。spark的应用程序总体来说,主要包括两部分,一部分是Driver,其包括了SparkConf和SparkContext,另一部分就是Executor,运行具体的业务逻辑。
应用程序的提交有两种方式,
1、Driver进程运行在客户端,对应用程序进行监控。
2、主节点指定某个worker节点启动Driver,负责整个应用的监控。
Driver一般运行在一台专门用来提交spark程序的机器上,这台机器一般一定和spark cluster在同样的网络环境中(因为Driver要频繁的和Execuotr进行通信,实质上是CorarseGrainExecutorBackend),并且配置和普通的Worker节点一致。可以通过spark-submit去运行程序,与此同时可以指定运行的各种参数,例如memory、cores...。实际生产环境写shell脚本自动化配置和提交程序,当然当前的机器一定安装了Spark,只不过当前机器不属于集群罢了。
Driver的核心是SparkContext,而SparkContext依赖于SparkConf。SparkContext在初始化的时候会创建DAGScheduler、TaskScheduler、SchedulerBackend。
在实例化的过程中回向Master注册应用程序,Master接受注册,如果没有问题,Master会为当前的应用程序分配AppId并分配计算资源。Master接受用户提交的程序并给Worker发送指令为当前的应用程序分配计算资源。每个Worker节点默认情况下为当前的程序分配一个Executor,在Executor中通过线程池并发执行。Worker节点收到Master发送的LaunchExecutor指令后,会创建ExecutorRunner实例,并调用start方法,来启动CoarseGrainExecutorBackend进程。CoarseGrainExecutorBackend进程里有Executor,并且CoarseGrainExecutorBackend和Executor是一一对应的。Executor内部会维护一个线程池,实际工作的时候,通过TaskRunner来封装task,然后从ThreadPool获取一条线程执行task,执行完后,线程会被回收复用。
在spark中,Transformation操作是延迟计算的,当有action算子时才会触发job。SparkContext会通过DAGScheduler把job中的RDD构成的DAG划分成不同的stage,每个stage内部都是一系列业务逻辑完全相同但是处理数据不同的Tasks,构成TaskSet。
TaskScheduler和SchedulerBackend负责具体的task的执行(遵循数据本地性)。
一个应用程序有可能包含多个stage,最后一个Stage中的Task称为ResultTask,产生job结果。其他前面的Stage中的Task都称为ShuffleMapTask,作为下一个Stage的数据输入,相当与MapReduce中的Mapper。

整个Spark程序的运行,就是DAGScheduler把job划分成不同的Stage,提交TaskSet给TaskScheduler,进而提交给Executor执行(符合数据本地性),每个Task会计算RDD中的一个Partition,基于该Partition来具体执行我们定义的一系列同一个Stage内部的函数,以此轮推...直到整个程序运行完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spark