千家信息网

Spark2.x中SparkContext的原理是什么

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,本篇文章给大家分享的是有关Spark2.x中SparkContext的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TaskS
千家信息网最后更新 2024年11月20日Spark2.x中SparkContext的原理是什么

本篇文章给大家分享的是有关Spark2.x中SparkContext的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

  1. TaskScheduler初始化、向SparkMaster节点进行Application、及Executor反向注册等(核心);

  2. DAGScheduler创建和初始化;

  3. 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的原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0