Spark源码

Master和Worker Akka实现RPC通信原理
1.首先启动Master (actorSystem.actorof),然后启动所有的Worker
2.Worker启动后,在preStart方法中与Master建立连接,向Master发送注册,将Worker的信息(tcp协议,hostname 端口等)通过case class封装起来发送给Master
3.Master接收到Woker的注册消息后将Worker的信息保存起来 然后向Woker反馈注册成功、
4.Woker定期向Master发送心跳,为了报活。
5.Master定时清理超时的Worker

StandAlone模式
1.提交一个应用程序,执行spark-submit脚本,通过反射调用自定义类的main方法,进入业务逻辑
2.New SparkConext 这是Spark提交任务到集群的入口,执行主构造器,创建了SparkEnv,taskScheduer(里面new了DAGScheduler)
3.调用start方法启动taskScheduler
4.SchedulerBackend的实现类创建了DriverActor和ClientActor
5.clientActor向Master注册应用消息,Master将接受到的信息放到内存存储并且持久化引擎保存,再向clientActor反馈注册成功
6.Master开始资源调度,发送消息让Worker启动Executor,Worker启动成功后 Master向clientActor反馈Executor启动成功
7.Executor向DriverActor发送消息注册,DriverActor向Executor反馈注册成功。DriverActor查看是否有任务需要提交
8.当有Action触发时 ,向Executor提交任务
9.DriveActor的DAGScheduler解析job,切分stage,转化成taskSet(序列化)发送给TaskScheduler,再提交给Executor
10.所有stage完成后结束

提交时:提交一个应用程序, 通过调用脚本bin/spark-submit (是一个进程)
Class.forName通过反射调用自定义类的main方法,进入业务逻辑
New SparkContext() 执行主构造器 (1.创建了一个SparkEnv(创建ActorSystem实现RPC通信(通过AkkaUtils))
创建了taskScheduer (这里new DAGScheduler)
启动TaskScheduler(调用start方法)
(SchedulerBackend的实现类创建了DriverActor和ClientActor 。
SchedulerBackend接口 coarseGrainedScheduleBackend父类-(YarnScheduleBackend SparkDeployScheduleBackend CoarserMesosSchedule))
clientActor向Master注册应用消息 (类名内存等)Master将信息放到内存存储并持久化引擎保存,再向clientActor反馈注册成功
Master开始资源调度 (调度方式有两种:尽量打散与尽量集中)
Master发送消息让Worker启动Executor 把参数通过caseclass传递给worker
Master向clientActor发送消息 反馈Executor已经启动。
Worker创建一个ExecutorRunner线程,调用线程对象start方法 run方法(CoarseGrainExecutorBackend的声明周期方法,执行java子进程 )
Executor向DriverActor发送消息注册,DriverActor再向Executor反馈注册成功
Driver查看是否有任务需要提交( 创建一个Executor实例,用来执行业务逻辑(Mesos,YARN,standalone)主构造器创建线程池)
DriverActor向Executor提交任务,触发Action时真正提交任务,
Executor向DriverActor向Driver注册,Driver的DAGScheduler解析job,切分Stage,转换成TaskSet(序列化)给TaskScheduler再提交给Executor
所有stage都完成后作业结束

4.1.1.Spark运行模式
Spark集群运行有三种模式:Standalone 、Mesos 、YARN

Spark On YARN又分为两种运行模式(cluster模式和client模式)
两种模式的区别
cluster模式:Driver程序在YARN中运行,应用的运行结果不能在客户端显示,所以最好运行那些将结果最终保存在外部存储介质(如HDFS、Redis、Mysql)而非stdout输出的应用程序,客户端的终端显示的仅是作为YARN的job的简单运行状况。

client模式:Driver运行在Client上,应用程序运行结果会在客户端显示,所有适合运行结果有输出的应用程序(如spark-shell)
Cluster原理
本地机器提交请求,并且上传应用程序到hdfs上 (设置运行环境和container上下文)
ResouceManager向NodeManager申请资源,创建Spark ApplicationMaster (唯一,管理全生命周期的应用)
NodeManager启动ApplicationMaster (并向ResourceManager ApplicationsManager注册)
ApplicationMaster从HDFS中找到jar文件, 启动SparkContext、DAGscheduler和YARN Cluster Scheduler
ResourceManager通知NodeManager分配Container,启动Executor,再向ApplicationMaster进行反向注册
(这时可以收到来自ApplicationsManager关于container的报告,每个container对应一个executor)
到这里为止,ApplicationMaster(Driver),就知道自己有哪些资源可以用(executor)。然后就会去执行job、拆分stage、提交stage的task,进行task调度,分配到各个executor上面去执行。
Spark ApplicationMaster直接和container(executor)进行交互,完成这个分布式任务

Client原理
客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和executor。ResouceManager向NodeManager申请资源,创建Spark ApplicationMaster,向ResourceManager申请nodeManager,启动Executor进程。Executor反向注册Dirver,最后,driver接收到属于自己的executor进程的注册之后,就可以去进行我们写的spark作业代码的执行了。
会一行一行的去执行咱们写的那些spark代码;执行到某个action操作的时候,就会触发一个job,然后DAGScheduler会将job划分为一个一个的stage,为每个stage都创建指定数量的task;TaskScheduler将每个stage的task,分配到各个executor上面去执行。
task,就会执行咱们写的算子函数。

(ApplicationMaster(ExecutorLauncher)负责executor的申请;driver负责job和stage的划分,以及task的创建、分配和调度。 )

你可能感兴趣的:(大数据之路)