十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本期主要介绍下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内部的函数,以此轮推...直到整个程序运行完成。