深入理解 Spark(二)SparkApplication 提交和运行源码分析

这篇具有很好参考价值的文章主要介绍了深入理解 Spark(二)SparkApplication 提交和运行源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spark 核心流程

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

yarn-client

yarn-cluster

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

spark 任务调度

spark stage 级别调度

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

spark task 级别调度

失败重试和白名单

对于运行失败的 Task,TaskSetManager 会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的 Task 池子中等待重新执行,当重试次数过允许的最大次数,整个 Application失败。在记录 Task 失败次数过程中,TaskSetManager 还会记录它上一次失败所在的 ExecutorId 和 Host,这样下次再调度这个 Task 时,会使用黑名单机制,避免它被调度到上一次失败的节点上,起到一定的容错作用。

spark 的任务提交源码剖析

spark 中 DAG 引擎的设计

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

spark 的 runtime 运行环境

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

面向 DAG 调度的 DAGScheduler

1、主要作用:维护 waiting jobs 和 active jobs 两个队列,维护 waiting stages、active stages 和 failed stages,以及与 jobs 的映射关系。
2、工作机制:DAGScheduler 拿到一个 JOB, 会切分成多个 Stage,从 job 的后面往前寻找 shuffle 算子。如果找到一个 shuffle 算子,就切开,已经找到的 RDD 的执行链就自成一个 Stage,放入到一个栈中。将来 DAGScheduler 要把这个栈中的每个 stage 拿出来,提交给 TaskScheduler。
3、核心描述

  • 一个 Application = 多个 job
  • 一个 job = 多个 stage,也可以说一个 application = 多个 stage
  • 一个 Stage = 多个同种 task 并行运行
  • Task 分为 ShuffleMapTask 和 ResultTask
  • Dependency 分为 ShuffleDependency 宽依赖 和 NarrowDependency 窄依赖
  • 面向 stage 的切分,切分依据为宽依赖

面向 Task 调度的 TaskScheduler

TaskScheduler:DAGScheduler 把 Stage 变成 TaskSet,然后交由 TaskScheduler 执行任务分发
1、TaskScheduler 本身是个接口,Spark 里只实现了一个 TaskSchedulerImpl,理论上任务调度可以定制。
2、维护 task 和 executor 对应关系,executor 和物理资源对应关系,在排队的 task 和正在跑的 task。
3、维护内部一个任务队列,根据 FIFO 或 Fair 策略,调度任务。
4、TaskScheduler 有两个重要的成员变量:
(1)DAGScheduler:负责 job 中的 stage 切分,
(2)SchedulerBackend:执行 Task 的分发

SparkContext / SparkSession

无所不包容的一个容器,spark App 在运行过程中的,各种信息都存储在 SparkContext 中。SparkContext / SparkSession 是 Spark Application 运行时上下文对象,包含了很多其他功能组件。
1、SparkContext 是用户通往 Spark 集群的唯一入口,可以用来在 Spark 集群中创建 RDD、累加器 Accumulator 和广播变量 Braodcast Variable,但是你想要的功能,你问他就行。
2、SparkContext 也是整个 Spark 应用程序中至关重要的一个对象,可以说是整个应用程序运行调度的核心(不是指资源调度)
3、SparkContext 在实例化的过程中会初始化 DAGScheduler、TaskScheduler 和 SchedulerBackend
4、SparkContext 会调用 DAGScheduler 将整个 Job 划分成几个小的阶段(Stage),TaskScheduler 会调度每个 Stage 的任务 (Task) 应该如何处理。另外,SchedulerBackend 管理整个集群中为这个当前的应用分配的计算资源 (Executor)

SparkConf + SparkEnv

SparkConf 是 Spark 中用来管理配置一个的管理类,类似于 Hadoop 中的 Configuration。
SparkEnv 是 Spark Application 在运行的时候,所需要的各种功能组件的一个整合体,类似于 Hadoop 中的 Context。
深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

Spark Runtime 组件

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维
深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维
深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

Spark Application 应用程序编写规范

1、重点:获取程序编写入口 SparkContext:new SparkContext(sparkConf)(新版本: SparkSession.getOrCreate();)
2、通过 SparkContext 来加载数据源得到数据抽象对象:RDD
3、针对数据抽象对象 RDD 调用各种算子执行各种逻辑计算:lazy,延迟到 action 的内部来执行
4、重点:调用 action 算子触发任务的提交执行:sparkContext.runJob()
5、处理结果并且关闭资源

Spark Application 应用程序执行流程详解

Spark Application 提交执行过程中的消息交互,大致如下:在通过 spark-submit 提交一个 App 运行的时候,其实是执行 SparkSubmit 这个类,启动 Client,在它的内部,启动一个 RPC 客户端。
最容易造成误解的两个概念:

  • Worker Server Node 一台硬件服务器
  • Worker JVM Process 一个 Spark 集群的 从节点 JVM 守护进程

简单版

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

详细版

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

01、理解业务,了解 Spark 编程,编写业务代码实现
02、将应用程序项打成 jar 包
03、通过 spark-submit 脚本来提交,在提交的时候,可以指定资源系统类型
04、执行 SparkSubmit 类的 main ()
05、在标准的 Spark Standalone 集群中:转交给 ClientApp 的类来执行,如果是 Spark on yarn,则客户端类是:YarnClusterApplication
06、会在 ClientApp 内部初始化 CLientEndponit(存在于client中) 的组件:发送 RequestSubmitDriver 给 Master
07、Master 处理 RequestSubmitDriver 消息: 注册 Driver, 启动 Driver,返回 SubmitDriverResponse 消息给 ClientApp 的 CLientEndponit
08、启动 Driver: java DriverWrapper 这个类,转到: DriverDrapper main() 方法
09、通过反射的方式启动和执行我们自己写的业务代码的 main() 方法: JavaWordCount.main()
10、自己编写的业务代码中的第一句代码: 初始化 SparkSessoin(SparkConf, SparkContext)
11、初始化 SparkContext: TaskScheduler SchedulerBackend(DriverEndpoint CLientEndpoint) DAGScheduler
12、应用注册:ClientEndpoint 发送 RegisterApplication 消息给 Master, 返回 RegisteredApplication
13、Master 发送消息 LaunchExecutor 给 Worker, 启动 Executor(真正启动的是:ExecutorBackend)
14、Executor 启动了,则初始化一个线程池,等待 Driver 分发任务过来,由线程池执行,Executor 启动好了之后,会向 Driver 注册,同时也会向 Master 反馈
15、当一个 Spark job 的 Driver 和 Executor 都启动好了之后,那么意味着 Spark Context 的初始化就搞定了
16、接下来就是 Action 算子执行,触发 job 的提交:sparkContext.runJob();
17、SparkContext 中的 DAGScheduler 对应用代码构建的 DAG 进行 stage 切分
18、SparkContext 中的 TaskScheduler 对当前 Stage 进行提交执行:发送 LaunchTask 消息给 Executor,在 Executor 中的一个线程中启动一个 Task

spark-submit 脚本分析

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维

DAGScheduler 异步模型

深入理解 Spark(二)SparkApplication 提交和运行源码分析,大数据,服务器,servlet,运维文章来源地址https://www.toymoban.com/news/detail-796899.html

到了这里,关于深入理解 Spark(二)SparkApplication 提交和运行源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 企业Spark案例--酒店数据分析实战提交

    第1关:数据清洗--过滤字段长度不足的且将出生日期转: package com.yy   import org.apache.spark.rdd.RDD import org.apache.spark.sql.{DataFrame, Dataset, SparkSession} object edu{     /**********Begin**********/     // 此处可填写相关代码     case class Person(id:String,Name:String,CtfTp:String,CtfId:String,G

    2024年02月09日
    浏览(40)
  • 深入理解 Flink(六)Flink Job 提交和 Flink Graph 详解

    深入理解 Flink 系列文章已完结,总共八篇文章,直达链接: 深入理解 Flink (一)Flink 架构设计原理 深入理解 Flink (二)Flink StateBackend 和 Checkpoint 容错深入分析 深入理解 Flink (三)Flink 内核基础设施源码级原理详解 深入理解 Flink (四)Flink Time+WaterMark+Window 深入分析 深入

    2024年01月16日
    浏览(31)
  • 【详解】Spark数据倾斜问题由基础到深入详解-完美理解-费元星

    数据倾斜定义:顾名思义,就是大量相似或相同数据聚集在一个块的节点里,导致计算和资源分配不均导致的计算缓慢(长尾)问题。 数据倾斜原因: count(distinct field) group by  NULL 空值 Shuffle (概率最高、发生最普遍的数据倾斜问题,本文重点讲述这个) ##########################

    2024年02月20日
    浏览(32)
  • Spark on Yarn 部署模式运行常用参数和认证参数理解

    Spark支持以下三种部署模式 Client模式:在Client模式下,驱动程序运行在提交应用程序的客户端上。应用程序使用集群中的资源来执行任务。 这种模式适用于开发和调试应用程序,因为它允许开发人员与驱动程序交互并查看应用程序的输出。 Cluster模式:在Cluster模式下,驱动程

    2024年02月06日
    浏览(64)
  • 【JVM】(一)深入理解JVM运行时数据区

    JVM 是 Java 程序的运行基础和运行环境,同时也是 Java 实现 \\\"一次编译,到处运行\\\" 的关键所在。因此,深入了解 JVM 对于学习和理解 Java 编程语言是至关重要的,那么JVM 到底是如何运行的呢? 下面这张图片展示了 JVM 的基本运行过程: JVM的执行过程涉及以下主要组成部分::

    2024年02月14日
    浏览(32)
  • Git的核心概念:探索Git中的提交、分支、合并、标签等核心概念,深入理解其作用和使用方法

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(37)
  • [AIGC ~大数据] 深入理解Hadoop、HDFS、Hive和Spark:Java大师的大数据研究之旅

    作为一位Java大师,我始终追求着技术的边界,最近我将目光聚焦在大数据领域。在这个充满机遇和挑战的领域中,我深入研究了Hadoop、HDFS、Hive和Spark等关键技术。本篇博客将从\\\"是什么\\\"、\\\"为什么\\\"和\\\"怎么办\\\"三个角度,系统地介绍这些技术。 Hadoop Hadoop是一个开源的分布式计算

    2024年02月03日
    浏览(31)
  • 深入理解Flink IntervalJoin源码

    IntervalJoin基于connect实现,期间会生成对应的IntervalJoinOperator。 并且会根据给定的自定义Function构建出对应的TwoInputTransformation,以便能够参与Transformation树的构建。 作为ConnectedStreams,一旦left or right流中的StreamRecord抵达,就会被及时处理: 两者的处理逻辑是相同的: 先取出当

    2024年02月12日
    浏览(28)
  • jvm复习,深入理解java虚拟机一:运行时数据区域

            程序计数器 (Program Counter Register) 它是程序控制流的指示器,简单来说,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器          Java虚拟机栈 (Java Virtual Machine Stack)也是线程私有的,它的生命周期 与线程相同。虚拟机栈描述

    2024年01月22日
    浏览(38)
  • “深入探索JVM内部机制:理解Java虚拟机的运行原理“

    标题:深入探索JVM内部机制:理解Java虚拟机的运行原理 摘要:本篇博客将深入探索Java虚拟机(JVM)的内部机制,帮助读者理解JVM的运行原理。我们将介绍JVM的组成结构,包括类加载器、运行时数据区域和执行引擎,并通过示例代码解释这些概念的具体应用。 正文: 一、J

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包