spark1.2源码学习之任务调度1

Spark源码和调优简介 Spark Core 作者:calvinrzluo,腾讯 IEG 后台开发工程师本文基于 Spark 2.4.4 版本的源码,试图分析其 Core 模块的部分实现原理,其中如有错误,请指正。为了简化论述,将部... 阅读详情

写在最前,真的很少写博客,周五答应群里的哥们要写一写,硬着头皮写吧。如果有不对不好的地方,欢迎各种打脸。哈哈下面开始正文

1、任务调度从创建sparkContext开始

class SparkContext(config: SparkConf)

// 初始化schedulerBackend和taskScheduler
 private[spark] var (schedulerBackend, taskScheduler) =
 SparkContext.createTaskScheduler(this, master)

2、进入createTaskScheduler方法

//此处指追踪standAlone模式
case SPARK_REGEX(sparkUrl) =>
//scheduler是TaskSchedulerImpl类
        val scheduler = new TaskSchedulerImpl(sc)
        val masterUrls = sparkUrl.split(",").map("spark://" + _)
        //backend是SparkDeploySchedulerBackend
val backend = new SparkDeploySchedulerBackend(scheduler, sc,masterUrls)
        	//初始化scheduler,入参是SparkDeploySchedulerBackend的实例
scheduler.initialize(backend)
    //实例化完毕,返回。
(backend, scheduler)

//实例化dagScheduler
dagScheduler = new DAGScheduler(this)
// 调用taskScheduler的start方法,初始化运行环境
taskScheduler.start()

注意,这里调用的是TaskSchedulerImpl的start方法

3、先看上面提到的scheduler.initialize(backend)方法

def initialize(backend: SchedulerBackend) {
//set方法,不解释了。
    this.backend = backend
// 以下内容是建立一个任务的调度池,并指定调度规则,默认是FIFO方式
//调度方式由spark.scheduler.mode参数确定
    rootPool = new Pool("", schedulingMode, 0, 0)
    schedulableBuilder = {
      schedulingMode match {
        case SchedulingMode.FIFO =>
          new FIFOSchedulableBuilder(rootPool)
        case SchedulingMode.FAIR =>
          new FairSchedulableBuilder(rootPool, conf)
      }
    }
    schedulableBuilder.buildPools()
  }

4、下面继续看start方法。

override def start() {
这里的backend就是initialize方法传入的,继续追踪backend的start方法。
这里要啰嗦一句,start方法下面的代码块我还没看懂,所以略过。
    backend.start()
    if (!isLocal && conf.getBoolean("spark.speculation", false)) {
      logInfo("Starting speculative execution thread")
      import sc.env.actorSystem.dispatcher
      sc.env.actorSystem.scheduler.schedule(SPECULATION_INTERVAL milliseconds,
            SPECULATION_INTERVAL milliseconds) {
        Utils.tryOrExit { checkSpeculatableTasks() }
      }
    }
  }

进入SparkDeploySchedulerBackend类找start方法,这个方法比较长,一步步的看吧。

但是中间涉及到很多的调用和代码,所以这个方法将被我从中间断开。


override def start() {
首先调用的是父类的start方法,继续杀入父类CoarseGrainedSchedulerBackend
    super.start()

下面看父类的的start方法

override def start() {
    	val properties = new ArrayBuffer[(String, String)]
    	for ((key, value) <- scheduler.sc.conf.getAll) {
      		if (key.startsWith("spark.")) {
       			properties += ((key, value))
      		}
    	}
//这里,实例化了一个driverActor是CoarseGrainedSchedulerBackend中的DriverActor
    	driverActor = actorSystem.actorOf(
      	Props(new DriverActor(properties)), name = 
		CoarseGrainedSchedulerBackend.ACTOR_NAME)
  }

    // 记住这个url,这个是master的akka同学
    val driverUrl = "akka.tcp://%s@%s:%s/user/%s".format(
      SparkEnv.driverActorSystemName,
      conf.get("spark.driver.host"),
      conf.get("spark.driver.port"),
      CoarseGrainedSchedulerBackend.ACTOR_NAME)
    val args = Seq(driverUrl, "{{EXECUTOR_ID}}", "{{HOSTNAME}}", "{{CORES}}", "{{APP_ID}}",
      "{{WORKER_URL}}")
    val extraJavaOpts = sc.conf.getOption("spark.executor.extraJavaOptions")
      .map(Utils.splitCommandString).getOrElse(Seq.empty)
    val classPathEntries = sc.conf.getOption("spark.executor.extraClassPath").toSeq.flatMap { cp =>
      cp.split(java.io.File.pathSeparator)
    }
    val libraryPathEntries =
      sc.conf.getOption("spark.executor.extraLibraryPath").toSeq.flatMap { cp =>
        cp.split(java.io.File.pathSeparator)
      }

    // Start executors with a few necessary configs for registering with the scheduler
    val sparkJavaOpts = Utils.sparkJavaOpts(conf, SparkConf.isExecutorStartupConf)
    val javaOpts = sparkJavaOpts ++ extraJavaOpts
    val command = Command("org.apache.spark.executor.CoarseGrainedExecutorBackend",
      args, sc.executorEnvs, classPathEntries, libraryPathEntries, javaOpts)
val appUIAddress = sc.ui.map(_.appUIAddress).getOrElse("")
//这里实例化一个ApplicationDescription
    val appDesc = new ApplicationDescription(sc.appName, maxCores, sc.executorMemory, command,appUIAddress, sc.eventLogDir)
//这里实例化一个AppClient
    client = new AppClient(sc.env.actorSystem, masters, appDesc, this, conf)
    client.start()

   

进入client的start方法

def start() {
    	// 实例化一个actor,当然就在AppClient类里面
    		actor = actorSystem.actorOf(Props(new ClientActor))
}


大家都知道,实例化一个actor首先会自动运行里面的preStart方法,那么看看这个方法

override def preStart() {
      context.system.eventStream.subscribe(self, classOf[RemotingLifecycleEvent])
      try {
重点在这里,向Master注册
        registerWithMaster()
      } catch {
        case e: Exception =>
          logWarning("Failed to connect to master", e)
          markDisconnected()
          context.stop(self)

      }
    }








spark 画图详解:资源调度再到任务调度 讲说spark的资源调度和任务调度,基本的spark术语,这里不再多说,懂的人都懂了。。。 按照数字顺序阅读,逐渐深入理解:以下所有截图均为个人上传,不知道为什么总是显示别人的QQ,好尴尬,无所谓啦,开始吧~~ 1 宽窄依赖与Stage划分: 上熟悉的图:   在 Spark 里每一个操作生成一个 RDD,RDD 之间连一条边,最后这些 RDD 和他们之间的边组成一个有向无环图,这个... 阅读详情

相关推荐

【Spark Core】从作业提交到任务调度完整生命周期浅析

引言这一小节我们将就之前写的几篇博文,从提交Job,到Stage划分,到任务分发,再到任务的执行,这一完整过程做一系统的回顾。在这一过程中理清思路,明确几篇文章中涉及到的调度关系和逻辑关系。Spark作业提交到执行过程 上面这个图摘自张包峰的csdn博客,这个图很清晰的描述了作业提交执行的整个过程,略去了细节原理,给人一种清晰直观的流程概况。 通过该图结合一下我之前的博文来描述一下文章的内容和相

Jason Ding的专栏 2571

Spark任务调度源码分析

自上而下的思想 提交job ——获取宽依赖 ———创建stage——创建Task //任意行动算子,点进去 resultRDD.collect() def collect(): Array[T] = withScope { val results = sc.runJob(this, (iter: Iterator[T]) => iter.toArray)**//runJob运行 作业任务** Array.concat(results: _*) } def runJob[T, U

数据开发探索者 372

深入研究Apache Spark 1.6.1源码包

Spark作为当下最流行的分布式计算框架之一,在大数据处理领域发挥着举足轻重的作用。本章节将带你回顾Spark的历史发展和应用背景,探索其创新的架构设计和理论基础,并与传统分布式计算框架进行比较,从而全面理解Spark在数据处理领域的革命性突破。性能提升是Spark 1.6.1版本的另一个亮点。通过优化底层执行计划的生成、执行以及内存管理,该版本在大规模数据处理上较以往版本有显著的速度提升。例如,针对SQL查询性能的提升,使得在相同硬件条件下处理相同数据集时,速度提升了20%。

weixin_42514750的博客 1185

[Spark源码剖析] Task的调度与执行源码剖析

本文基于Spark 1.3.1,Standalone模式 一个Spark Application分为stage级别和task级别的调度,stage级别的调度已经用DAGScheduler划分stage和DAGScheduler提交stage两片文章进行源码层面的说明,本文将从源码层面剖析task是如何被调度和执行的。函数调用流程先给出task调度的总体函数调用流程,并说明每个关键函数是干嘛的。这样一

Bbbbbbbbbbbbig data~ 1218

麒麟系统下PaddleOCR的离线部署实战:从环境搭建到模型优化

本文详细介绍了在国产麒麟操作系统上离线部署百度PaddleOCR的完整实战流程。从系统环境准备、Conda虚拟环境搭建,到PaddlePaddle框架和PaddleOCR的离线安装,再到预训练模型的本地部署与优化技巧,提供了全面的文字识别解决方案。重点解决了离线环境下依赖包管理、模型量化加速等核心问题,并附带了批量处理与内存监控的进阶代码,适用于对数据安全有严格要求的政务、金融等场景。

docker7nomad的博客 963

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2434

Spark---资源、任务调度

例如:要找出网站活跃的前10名用户,活跃用户的评测标准就是用户在当前季度中登录网站的天数最多,如果某些用户在当前季度登录网站的天数相同,那么再比较这些用户的当前登录网站的时长进行排序,找出活跃用户。1、默认情况每个worker为当前的Application启动一个Executor,这个Executor使用集群中所有的cores和1G内存。2、在workr上启动多个Executor,设置--executor-cores参数指定每个executor使用的core数量。3、内存不足的情况下启动core的情况。

yaya_jn的博客 1962

特斯拉 Model 3解析(九)特斯拉 Model 3 自动驾驶域控制器硬件架构

硬件层:车规级高密度主板 → PI/SI优化到极致传感器层:三目摄像头主导视觉,雷达补充冗余,超声波保证近距设计理念:依靠芯片算力最大化视觉潜力,而不是堆传感器这套思路的优点是:成本可控、量产快、迭代快。缺点是:极端场景下感知鲁棒性不足。纯视觉方案短期可行,但中长期必然要重新引入高分辨率雷达甚至固态LiDAR作为冗余。电源/信号完整性会越来越关键,未来域控板设计会越来越像数据中心服务器。

weixin_43199439的博客 1784

Spark资源调度和任务调度

Spark client模式下任务成功运行时会在node1、node2两个节点,随机一个节点上启动两个进程 :1) ApplicationMaster : 所有任务在yarn上运行都会启动的进程2) Executor : 执行器在master节点启动一个进程 :1) SparkSubmit -- client模式下就是一个Driver任务结束后这几个进程会立即消失这是Spark向yarn申请到的资源。

a_black03的博客 1614

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

别再为OpenBCI_GUI安装发愁了!保姆级教程带你从Processing配置到成功运行(附常见错误解决)

本文提供了一份详细的OpenBCI_GUI安装教程,涵盖从Processing配置到成功运行的全过程,特别针对常见错误提供了解决方案。通过环境搭建、软件依赖安装、源码处理及首次运行实战,帮助用户高效完成数据可视化工具的部署与使用。

weixin_28366475的博客 267

Spark源码阅读(三) --- Spark的任务调度机制

一、任务调度机制的概述

weixin_42325002的博客 1082

DP接口详解:从主链路到AUX通道的完整解析(附常见问题排查)

本文深入解析DP接口的三大核心子系统:主链路的高速数据传输、AUX通道的智能协商以及HPD信号线的即时响应。详细介绍了DP接口的物理层设计要点、链路训练与均衡技术,并提供了常见故障排查指南,帮助工程师解决实际应用中的技术难题。

weixin_30790841的博客 461

Spark源码阅读笔记之任务调度(一)

Spark源码阅读笔记之任务调度:应用(Application)、作业(Job)、阶段(Stage)、任务(Task)。用户写的spark程序就是一个应用,应用可以提交到集群(yarn、messos或spark原生集群)运行,一个spark应用运行期间可以执行多个spark作业,作业被分割为多个阶段,每个阶段是完成相同功能的任务的集合。

huangyuu5的专栏 1356

uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

uniapp实现文本的展开与收起功能,uniapp展开全部和收起,uniapp里文本的展开与收起,uniapp中文本内容超出规定行数后展开收起的处理,UNIAPP兼容h5、微信小程序多行文本展开或收起,uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文),uni-app中文本过长-实现折叠与展开效果,中文本内容超出规定行数(字数)后展开收起的处理,超出部分...显示,uniapp适用于uniapp多行文本溢出显示...,多行文本展开或收起,uni-app-文本展开/收起折叠功能,支

🏆 前端领域优质创作者 5638

目标跟踪与视频时序分析基础

两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。

Mr数据杨 2335

Spark1.3从创建到提交:3)任务调度初始化源码分析

上一节在SparkContext中也提及到了,在该类中创建了一个任务调度器,下面我们具体来分析这个方法 private[spark] var (schedulerBackend, taskScheduler) = SparkContext.createTaskScheduler(this, master) createTaskScheduler的代码如下: private def cr

Javis486的专栏 884

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spark内核详解 (5) | Spark的任务调度机制

  大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/   本片博文为大家带来的是Spark的任务调度机制。 目录 .

不温卜火 6935

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spark源码-Spark任务调度、资源调度与yarn调度浅析

Spark源码-Spark任务调度、资源调度与yarn调度浅析 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Mar

weixin_38240453的博客 1051

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spark学习-2.4.0-源码分析-1-Spark 核心篇-SparkContext

文章目录1、功能描述2、相关组件3、代码分析3.1 初始设置3.2 创建执行环境SparkEnv3.3 创建SparkUI3.4 Hadoop 相关配置3.5 Executor 环境变量3.6 注册HeartbeatReceiver心跳接收器3.7 创建任务调度器TaskScheduler3.8 创建和启动DAGScheduler3.9 TaskScheduler启动3.10 启动测量系统Metr...

pre_tender的博客 1020

spark 设置主类_Spark资源调度、任务调度源码及流程图

1. Spark-Submit提交参数Options: Master: MASTER_URL, 可以是spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, localdeploy-mode:DEPLOY_MODE, Driver程序运行的地方,client或者cluster,默认是client。Class:CLA...

weixin_39603823的博客 296

Spark任务调度策略/资源分配

Spark任务调度策略 FIFO    FIFO(先进先出)方式调度Job,每个Job被切分成多个Stage。第一个Job优先获取所有可用资源,接下来第二个Job再获取剩余可用资源。(每个Stage对应一个TaskSetManager) 优先级(Priority): 在DAGscheduler创建TaskSet时使用JobId作为优先级的值。FIFO调度算法实现如下所示 private[spar...

ThreeAspects的博客 1754

Spark之任务调度

目录 调度模式 调度时机 可调度任务 任务级别 Schedulable 属性 方法 SchedulableBuilder 排序算法 FIFOSchedulingAlgorithm.comparator FairSchedulingAlgorithm.comparator 任务调度器 PreferredLocation Pending Task Task调度器 ...

796

Spark源码分析之作业和任务调度流程

一.前言 Spark的作业和任务调度系统是其核心。Spark的作业调度主要是基于RDD的一系列操作构成一个作业,然后在Executor上执行,这些操作算子主要分为转换和行动算子,对于转换算子的计算是lazy级别的,也就是延迟执行,只有出现了行动算子才触发作业的提交。在Spark调度中,最重要的是DAGScheduler和TaskSechduler两个调度器...

SmallCatBaby的博客 826

Spark2.4.0 SparkContext 源码分析

Spark2.4.0 SparkContext 源码分析 更多资源 github: https://github.com/opensourceteams/spark-scala-maven-2.4.0 时序图 前置条件 Hadoop版本: hadoop-2.9.2 Spark版本: s...

chongqueluo2709的博客 254

详解 spark_主题:Spark内核之任务调度机制详解(读源码最详细)

铺垫Spark集群在生产环境下的部署方式一般为Yarn-Cluster模式,之后的内核分析中我们默认为Yarn-Cluster的部署方式展开。在上一篇文章中我们讲解了Spark Yarn-Cluster模式下的任我流程(如果没有看到的小伙伴,建议移步历史文章,上一篇讲的部署模式的源码,更有助于理解本篇内容),但是并没有具体说明Driver的工作流程,Driver现成主要是初始化SparkConte...

weixin_42361283的博客 123
上一篇: strut2执行流程介绍之init方法
went_java
博客等级 码龄17年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值