热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spark2.x中SparkContext的原理是什么

本篇文章给大家分享的是有关Spark2.x中SparkContext的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获

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

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

  2. DAGScheduler创建和初始化;

  3. SparkUI界面的创建和初始化;

    下面我就结合源码详细讲解SparkContext的原理和加载过程,这里说明一下我们生产环境用的是Spark2.x,这里就拿Spark2.2.0的源码进行讲解,这里引用网上的一张SparkContext原理剖析图:

Spark2.x中SparkContext的原理是什么

一.TaskScheduler:

  在源码SparkContext.scala中首先调用函数createTaskScheduler()创建TaskScheduler;

Spark2.x中SparkContext的原理是什么

    在createTaskScheduler中会根据你的提交模式,分别进行对应模式下的代码,不同的提交模式,会创建不同的TaskScheduler,这里我们以standalone模式进行讲解:

Spark2.x中SparkContext的原理是什么

    函数createTaskScheduler先去创建一个TaskSchedulerImpl(它其实就是TaskScheduler),然后创建SparkDeploySchedulerBackend(它在底层会受TaskSchedulerImp的控制,实际上负责与Master的注册,Executor的反注册,Task发送到Executor等操作),然后调用TaskSchedulerImpl的initialize()方法,代码如下:

Spark2.x中SparkContext的原理是什么

    最后一行代码会根据不同的调度策略,调用函数buildPools去创建调度池。

    TaskScheduler和DAGScheduler创建完成后,调用TaskScheduler的start()函数启动,其实函数内部是调用了SchedulerBackend的start()函数,

Spark2.x中SparkContext的原理是什么

    start()函数中,先是从spark-submit命令行中获取用户提交的一些参数进行了初始化,比如driverUrl、extraJavaOpts、classPathEntries、libraryPathEntries等,通过这些参数创建ApplicationDescription实例,这个ApplicationDescription非常重要,它代表了当前用户提交的application的一切情况,包括application最大需要多少CPU Core,每个slave上需要多少内存等信息。最后去创建一个APPClient实例,由于这里是Standalone模式所以这里创建一个StandaloneAppClient实例,它负责为application与Spark集群进行通信。它会接收一个Spark Master的URL,以及一个application,和一个集群事件的监听器,以及各种事件发生时监听器的回调函数,如下图:

Spark2.x中SparkContext的原理是什么

    至此TaskScheduler启动完成,调用waitForRegistration()函数等待注册完成;

二、DAGScheduler的创建

    DAGScheduler类实现了面向stage的调度机制的高层次的调度层,代码位置:

Spark2.x中SparkContext的原理是什么

    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服务器来显示网页,代码位置:

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


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • dataguard日志传输模式解析_SOFAJRaft 日志复制pipeline 实现剖析 | SOFAJRaft 实现原理
    SOFAStack(ScalableOpenFinancialArchitectureStack)是蚂蚁金服自主研发的金融级分布式架构,包 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • spark的任务已经执行完成:scalavallinesc.textFile(hdfs:vm122:9000dblp.rdf)line:org.apache ... [详细]
  • rust编程这篇文章是关于我通过解决Twitch上尚未解决的所有CtCI问题来学习Rust的经验。英国科学博物馆集团AdaLovelace的肖像Rust徽标,由Moz ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
author-avatar
礼貌粑粑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有