您好,登录后才能下订单哦!
本篇文章给大家分享的是有关Spark2.x中SparkContext的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
TaskScheduler初始化、向SparkMaster节点进行Application、及Executor反向注册等(核心);
DAGScheduler创建和初始化;
SparkUI界面的创建和初始化;
下面我就结合源码详细讲解SparkContext的原理和加载过程,这里说明一下我们生产环境用的是Spark2.x,这里就拿Spark2.2.0的源码进行讲解,这里引用网上的一张SparkContext原理剖析图:
一.TaskScheduler:
在源码SparkContext.scala中首先调用函数createTaskScheduler()创建TaskScheduler;
在createTaskScheduler中会根据你的提交模式,分别进行对应模式下的代码,不同的提交模式,会创建不同的TaskScheduler,这里我们以standalone模式进行讲解:
函数createTaskScheduler先去创建一个TaskSchedulerImpl(它其实就是TaskScheduler),然后创建SparkDeploySchedulerBackend(它在底层会受TaskSchedulerImp的控制,实际上负责与Master的注册,Executor的反注册,Task发送到Executor等操作),然后调用TaskSchedulerImpl的initialize()方法,代码如下:
最后一行代码会根据不同的调度策略,调用函数buildPools去创建调度池。
TaskScheduler和DAGScheduler创建完成后,调用TaskScheduler的start()函数启动,其实函数内部是调用了SchedulerBackend的start()函数,
start()函数中,先是从spark-submit命令行中获取用户提交的一些参数进行了初始化,比如driverUrl、extraJavaOpts、classPathEntries、libraryPathEntries等,通过这些参数创建ApplicationDescription实例,这个ApplicationDescription非常重要,它代表了当前用户提交的application的一切情况,包括application最大需要多少CPU Core,每个slave上需要多少内存等信息。最后去创建一个APPClient实例,由于这里是Standalone模式所以这里创建一个StandaloneAppClient实例,它负责为application与Spark集群进行通信。它会接收一个Spark Master的URL,以及一个application,和一个集群事件的监听器,以及各种事件发生时监听器的回调函数,如下图:
至此TaskScheduler启动完成,调用waitForRegistration()函数等待注册完成;
二、DAGScheduler的创建
DAGScheduler类实现了面向stage的调度机制的高层次的调度层,代码位置:
DAGScheduler创建主要干了以下几件事:
1).每个job计算一个stage的DAG(有向无环图),stage是根据action进行划分的;
2).追踪RDD的stage输出,是否写入磁盘或者内存等存储介质中;
3).寻找一个消耗(最优、最小)调度机制来运行job;
4).负责将stage封装成Taskset提交到TaskSchdulerImpl,通过集群来运行一批task,这里注意:每一批task运行相同的代码,只是处理不同部分的数据,这里才体现了分布式计算;
5).负责每个task运行的最佳位置,根据当前缓存状态,将这些最佳位置提交给TaskSchdulerImpl;
6).处理由于shuffle导致文件输出丢失导致的失败,该stage会被重新提交;如果不是由于shuffle内部导致的失败,例如OOM,会被TaskSchdulerImpl处理,多次重试每一个task,如果最后还是不行,取消stage运行,最后整个app挂掉。
三、SparkUI的创建
这里是SparkContext初始化的最后一步,调用SparkUI中的函数createLiveUI进行界面的创建,默认绑定了4040端口,能显示Application的运行状态,这里会启动一个jetty服务器来显示网页,代码位置:
这里注册一个监听SparkListenerBusts,即所有spark消息SparkListenerEvents 被异步的发送给它. ,这个类主要功能如下:
1).保存有消息队列,负责消息的缓存
2).保存有注册过的listener,负责消息的分发
补充下yarn常用的三种调度策略:
1).FIFO Scheduler:
把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
2).Fair Scheduler:
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
3).Capacity Scheduler:
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
以上就是Spark2.x中SparkContext的原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。