Spark1.3.0核心源码分析,第一篇sparkContext初始化

原创
2017/06/15 23:59
阅读数 131

一. Spark核心框架吗原理图像分析

二、Spark源码分析

    写过Spark的朋友,我想大家都知道,当我们写好自己的Spark程序的时候,会打包成jar包的形式提交到Spark应用机器上,只是将程序提交到Spark应用机器这只是第一步,接着我们会写一个shell脚本来提交我们自己写个Spark开发程序,在这里我们说的是standalone模式,我们在用standalone模式提交时,会通过反射的方式,创建和构造一个driverActor进程。

    大家都知道我们在写自己的Spark应用程序的时候第一行都会写上

            SparkConf conf = new SparkConf()

                            .setAppName("");

               JavaSparkContext sc =new JavaSparkContext();(用Java语言写就用JavaSparkContext,用scala语言写用SpartContext)

写着两行只要进行SparkContext初始化,在SparkContext初始化中一般Spark源码会做两件事,也就是创建出DAGScheduler和TaskScheduler

    1)创建TaskScheduler Spark底层源码分析

        在Spark1.30源码中进行SparkContext初始化时,会找到SpartContext类中createTaskScheduler方法,

 

早createTaskScheduler中找到case SPATK_REGEX(sparkUrl),此为我常用的Standalocal方式

在这段代码中其是主要做了三件事

        第一  new了一个TaskSchulerImpl对象,其实这个就是TaskScheduler(暂不分析 )

 

        第二 new一个SparkDeploySchedulerBackend,实际会负责与master注册,Executor的反注册,task发送到excutor等操作

        第三 创建SchedulePool,它有不同的优先策略,比如FIFO

创建完了三个组件后就会执行通过TaskSchulerImpl调用其start方法,在start()中第一行就会通过backend对象调用其SparkDeploySchedulerBackend中start(),如图:

    在SparkDeploySchedulerBackend的start()中,new了一个ApplicationDescrption,这个ApplicationDescrption非常重要它代表了当前application执行状况,其中包含了最大需要多少cup core,每个slave上需要多少内存 等信息,然后又new了一个AppClient,通过client对象调用AppClient的start(),

AppClient是一个接口,它负责人application与Spark之间的通信,同时接受了一个master的url地址,以及一个applicationDescription和一个集群事件监听器,以及各种事件发生时,监听器回调函数,如图:

在start()方法中,主要创建了一个actor线程,如图:

然后,会找打ClientActor类(内部类),执行preStart(),找到registerWithMaster()方法,此方法即为注册方法 如图:

在registerWithMaster(),第一步就是调用了tryRegisterAllMaster()方法,在tryRegisterAllMaster()中它首先通过logInfo()方法连接到所有的master,在获取到master的actor,通过actor向master发送RegisterApplication信息,如图:

  2)创建DAGScheduler spark源码分析

    

DAGScheduler是一个实现面向stage调度机制的高级调度层,它会为每一个stage计算一个ADG(有向无环图),还会去追踪stage和RDD是否会被物化(也就是是否写入物理磁盘或内存上),并且寻找一个最优的调度机制来运行job,它会将stage作为tasksets提交到底层的taskSchedulerImpl。来在集群运行他们的(task),除了处理stage的DGA,它还负责决定运行每个task的最佳位置。基于当前的缓存的状态,将这些最佳位置交给底层的taskschedulerImpl
此外,它会处理shuffle输出文件丢失导致的失败,在这种情况下,旧的stage会重新提交,一个stage内部失败,不是因为shuffle文件丢失导致,会被taskschudeler处理,会多次重试每个task,直到最后实在不行,才会取消整个stage.

到此为止,为SparkContext初始化的大致原理与过程!!!

由于本人水平有限,以上有什么分析不到位的地方,和错误的地方,请大家多多指正和包涵!!!!!

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部