Spark底层原理:案例解析(第34天)

news/2024/9/11 3:29:49/ 标签: spark, 大数据, 分布式

系列文章目录

一、Spark架构设计概述
二、Spark核心组件
三、Spark架构设计举例分析
四、Job调度流程详解
五、Spark交互流程详解

文章目录

  • 系列文章目录
  • 前言
  • 一、Spark架构设计概述
    • 1. 集群资源管理器(Cluster Manager)
    • 2. 工作节点(Worker Node)
    • 3. 驱动程序(Driver Program/Driver)
  • 二、Spark核心组件
    • 1. Spark Core
    • 2. Spark SQL
    • 3. Spark Streaming
    • 4. Spark MLlib
    • 5. Spark GraphX
  • 三、Spark架构设计举例分析
  • 四、Job调度流程详解
  • 五、Spark交互流程详解
    • 1、client_Spark集群
    • 2、cluster_Spark集群
    • 3、client on Yarn集群
    • 4、cluster on Yarn集群


前言

Apache Spark是一个快速、通用、基于内存的分布式计算引擎,专为大规模数据处理而设计。其架构设计体现了高度的模块化和可扩展性,支持多种数据处理模式,包括批处理、实时流处理、交互式查询、机器学习和图计算等。以下将详细介绍Spark的架构设计,并结合具体例子进行分析。


一、Spark架构设计概述

Spark的架构设计遵循主从(Master-Slave)架构模式,主要由以下几部分组成:

1. 集群资源管理器(Cluster Manager)

  • 负责集群资源的分配和管理,包括CPU、内存等资源。根据不同的部署模式,Cluster Manager可以是Spark自带的Standalone模式,也可以是YARN、Mesos等第三方资源管理器。

2. 工作节点(Worker Node)

  • 执行提交的任务,通过注册机制向Cluster Manager汇报自身的资源使用情况。在Master的指示下,Worker Node会创建并启动Executor进程,用于执行具体的计算任务。

3. 驱动程序(Driver Program/Driver)

  • 运行应用程序的main()函数,负责创建SparkContext对象,并与Cluster Manager和Executor进行通信,以协调任务的执行。
  • 执行器(Executor):运行在Worker Node上的进程,负责执行Driver分配的任务,并将结果返回给Driver。Executor是Spark中真正的计算单元,它负责Task的运行并将结果数据保存到内存或磁盘上。

二、Spark核心组件

Spark基于Spark Core建立了多个核心组件,每个组件都提供了特定的数据处理能力:

1. Spark Core

  • 基础设施:包括SparkConf(配置信息)、SparkContext(Spark上下文)、Spark RPC(远程过程调用)、ListenerBus(事件总线)、MetricsSystem(度量系统)、SparkEnv(环境变量)等,为Spark的各种组件提供基础支持。
  • 存储系统:Spark的存储系统优先考虑在内存中存储数据,当内存不足时才会将数据写入磁盘。这种内存优先的存储策略使得Spark在处理大规模数据时具有极高的性能。
  • 调度系统:由DAGScheduler和TaskScheduler组成,负责任务的调度和执行。DAGScheduler负责将用户程序转换为DAG图,并根据依赖关系划分Stage和Task;TaskScheduler则负责按照调度算法对Task进行批量调度。
  • 计算引擎:由内存管理器、任务管理器、Task Shuffle管理器等组成,负责具体的计算任务执行。

2. Spark SQL

  • 提供基于SQL的数据处理方式,支持结构化数据的查询和分析。Spark SQL可以将结构化数据(如JSON、CSV、Parquet等)转换为RDD或DataFrame,并支持使用Hive元数据和SQL查询。

3. Spark Streaming

  • 提供流处理能力,支持从Kafka、Flume、Kinesis、TCP等多种数据源实时获取数据流,并将其转换为可供分析和存储的批处理数据。Spark Streaming使用DStream(离散流)作为数据流的抽象,并支持一系列的转换操作。

4. Spark MLlib

  • 提供机器学习库,包括统计、分类、回归、聚类等多种机器学习算法的实现。Spark MLlib的分布式计算能力使得在大规模数据上进行机器学习任务成为可能。

5. Spark GraphX

  • 提供图计算库,支持对大规模图结构数据进行处理和分析。GraphX通过Pregel提供的API可以快速解决图计算中的常见问题,如社交网络分析、网络拓扑分析等。

三、Spark架构设计举例分析

  • 以Spark Standalone模式为例,我们可以详细分析Spark的架构设计如何支持数据处理任务的执行:
  1. 集群启动:
  • 在Standalone模式下,集群由一个主节点(Master)和多个工作节点(Worker)组成。主节点负责管理集群资源并分配任务给工作节点;工作节点则负责执行具体的任务。
  • 集群启动时,Master节点会启动并监听来自Worker节点的注册请求。Worker节点在启动时向Master注册,并报告自身的资源情况(如CPU、内存等)。
  1. 任务提交:
  • 用户通过Driver程序提交Spark作业到集群。Driver程序首先创建SparkContext对象,并连接到Master节点以请求资源。
  • Master节点根据集群的资源情况和作业的资源需求,为Driver分配资源,并启动Executor进程。Executor进程是运行在Worker节点上的,用于执行具体的计算任务。
  1. 任务执行:
  • Driver程序将作业划分为多个Task,并通过Executor的RPC接口将Task发送到Executor上执行。
  • Executor接收到Task后,会在本地启动线程来并行执行Task。执行过程中,Executor会从存储系统(如HDFS)中加载数据,进行计算,并将结果返回给Driver。
    Driver收集所有Executor的执行结果,并进行汇总和处理,最终将结果输出给用户。
  1. 容错与恢复:
  • Spark通过RDD的容错机制来保证数据的可靠性和作业的可恢复性。RDD具有可容错性,当某个节点发生故障

四、Job调度流程详解

在这里插入图片描述

  • 1- Driver进程启动后,底层PY4J创建SparkContext顶级对象。在创建该对象的过程中,还会创建另外两个对象,分别是: DAGScheduler和TaskScheduler
    DAGScheduler: DAG调度器。将Job任务形成DAG有向无环图和划分Stage的阶段
    TaskScheduler: Task调度器。将Task线程分配给到具体的Executor执行

  • 2- 一个Spark程序遇到一个Action算子就会触发产生一个Job任务。SparkContext将Job任务给到DAG调度器,拿到Job任务后,会将Job任务形成DAG有向无环图和划分Stage的阶段。并且会确定每个Stage阶段有多少个Task线程,会将众多的Task线程放到TaskSet的集合中。DAG调度器将TaskSet集合给到Task调度器

  • 3- Task调度器拿到TaskSet集合以后,将Task分配给到给到具体的Executor执行。底层是基于SchedulerBackend调度队列来实现的。

  • 4- Executor开始执行任务。并且Driver会监控各个Executor的执行状态,直到所有的Executor执行完成,就认为任务运行结束

  • 5- 后续过程和之前一样

五、Spark交互流程详解

1、client_Spark集群

在这里插入图片描述
driver任务: Driver进程中负责资源申请的工作并且负责创建SparkContext对象的代码映射为Java对象,进行创建任务的分配、任务的管理工作。

1- submit提交任务到主节点Master

2- 在提交任务的那个客户端上启动Driver进程

3- Driver进程启动后,执行main函数,首先创建SparkContext对象。底层是基于PY4J,将创建SparkContext对象的代码映射为Java进行创建

4- Driver进程连接到Spark集群中的Master主节点,根据资源配置要求,向主节点申请资源,用来启动Executor

5- 主节点接收到资源申请之后,进行资源分配,底层是基于FIFO(先进先出)。分配好资源资源之后,将方案返回给到Driver进程
executor1:node1 2G 2CPU
executor2:node3 2G 2CPU

6-Driver连接到对应的Worker从节点上,占用相应的资源。通知Worker启动Executor进程。启动以后会反向注册回Driver

7-Driver开始处理代码
7.1- Driver加载RDD相关的算子,根据算子间的依赖关系绘制DAG有向无环图和划分Stage阶段,并且确定每个Stage阶段有多少个Task线程。需要分配给哪些Executor进行执行。
7.2- Driver通知对应的Executor进程来执行相应的任务
7.3- Executor开始执行具体的任务。但是发现代码中有大量的Python函数,而Executor是JVM进程,无法直接执行代码。因此会调用服务器上的Python解释器,将Python函数和输入数据传输给到Python解释器,执行完以后,将结果数据返回给Executor进程
7.4- Executor在运行过程中,会判断是否需要将结果数据返回给到Driver进程。如果需要,就返回给Driver进程;如果不需要,直接输出,结束即可。
7.5- Driver会定时检查多个Executor的执行状态。直到所有的Executor执行完成,就认为任务运行结束

8- Driver调用sc.stop()代码,通知Master回收资源。整个程序运行结束。

2、cluster_Spark集群

在这里插入图片描述
driver任务: Driver进程中负责资源申请的工作并且负责创建SparkContext对象的代码映射为Java对象,进行创建任务的分配、任务的管理工作。

和client on spark集群的区别点: Driver进程不是运行在提交任务的那台机器上了,而是在Spark集群中随机选择一个Worker从节点来启动和运行Driver进程

1- submit提交任务到主节点Master

2- Master主节点接收到任务信息以后,根据Driver的资源配置要求,在集群中随机选择(在资源充沛的众多从节点中随机选择)一个Worker从节点来启动和运行Driver进程

3- Driver进程启动以后,执行main函数,首先创建SparkContext对象。底层是基于PY4J,将创建SparkContext对象的代码映射为Java进行创建

4- Driver进程连接到Spark集群中的Master主节点,根据资源配置要求,向主节点申请资源,用来启动Executor

5- 主节点接收到资源申请之后,进行资源分配,底层是基于FIFO(先进先出)。分配好资源资源之后,将方案返回给到Driver进程
executor1:node1 2G 2CPU
executor2:node3 2G 2CPU

6-Driver连接到对应的Worker从节点上,占用相应的资源。通知Worker启动Executor进程。启动以后会反向注册回Driver

7-Driver开始处理代码
7.1- Driver加载RDD相关的算子,根据算子间的依赖关系绘制DAG有向无环图和划分Stage阶段,并且确定每个Stage阶段有多少个Task线程。需要分配给哪些Executor进行执行。
7.2- Driver通知对应的Executor进程来执行相应的任务
7.3- Executor开始执行具体的任务。但是发现代码中有大量的Python函数,而Executor是JVM进程,无法直接执行代码。因此会调用服务器上的Python解释器,将Python函数和输入数据传输给到Python解释器,执行完以后,将结果数据返回给Executor进程
7.4- Executor在运行过程中,会判断是否需要将结果数据返回给到Driver进程。如果需要,就返回给Driver进程;如果不需要,直接输出,结束即可。
7.5- Driver会定时检查多个Executor的执行状态。直到所有的Executor执行完成,就认为任务运行结束

8- Driver调用sc.stop()代码,通知Master回收资源。整个程序运行结束。

3、client on Yarn集群

在这里插入图片描述
在这里插入图片描述
区别点: 将Driver进程中负责资源申请的工作,转交给到Yarn的ApplicationMaster来负责。Driver负责创建SparkContext对象的代码映射为Java对象,进行创建任务的分配、任务的管理工作。

1- 首先会在提交的节点启动一个Driver进程

2- Driver进程启动以后,执行main函数,首先创建SparkContext对象。底层是基于PY4J,将创建SparkContext对象的代码映射为Java进行创建

3- 连接Yarn集群的主节点(ResourceManager),将需要申请的资源封装为一个任务,提交给到Yarn的主节点。主节点收到任务以后,首先随机选择一个从节点(NodeManager)启动ApplicationMaster

4- 当ApplicationMaster启动之后,会和Yarn的主节点建立心跳机制,告知已经启动成功。启动成功以后,就进行资源的申请工作,将需要申请的资源通过心跳包的形式发送给到主节点。主节点接收到资源申请后,开始进行资源分配工作,底层是基于资源调度器来实现(默认为Capacity容量调度器)。当主节点将资源分配完成以后,等待ApplicationMaster来拉取资源。ApplicationMaster会定时的通过心跳的方式询问主节点是否已经准备好了资源。一旦发现准备好了,就会立即拉取对应的资源信息。

5- ApplicationMaster根据拉取到的资源信息,连接到对应的从节点。占用相应的资源,通知从节点启动Executor进程。从节点启动完Executor之后,会反向注册回Driver进程

6-Driver开始处理代码
6.1- Driver加载RDD相关的算子,根据算子间的依赖关系绘制DAG有向无环图和划分Stage阶段,并且确定每个Stage阶段有多少个Task线程。需要分配给哪些Executor进行执行。
6.2- Driver通知对应的Executor进程来执行相应的任务
6.3- Executor开始执行具体的任务。但是发现代码中有大量的Python函数,而Executor是JVM进程,无法直接执行代码。因此会调用服务器上的Python解释器,将Python函数和输入数据传输给到Python解释器,执行完以后,将结果数据返回给Executor进程
6.4- Executor在运行过程中,会判断是否需要将结果数据返回给到Driver进程。如果需要,就返回给Driver进程;如果不需要,直接输出,结束即可。
6.5- Driver会定时检查多个Executor的执行状态。直到所有的Executor执行完成,就认为任务运行结束。同时ApplicationMaster也会接收到各个节点的执行完成状态,然后通知主节点。任务执行完成了,主节点回收资源,关闭ApplicationMaster,并且通知Driver。

7- Driver执行sc.stop()代码。Driver进程退出

4、cluster on Yarn集群

在这里插入图片描述
在这里插入图片描述
区别点: 在集群模式下,Driver进程的功能和ApplicationMaster的功能(角色)合二为一了。Driver就是ApplicationMaster,ApplicationMaster就是Driver。既要负责资源申请,又要负责任务的分配和管理。

1- 首先会将任务提交给Yarn集群的主节点(ResourceManager)

2- ResourceManager接收到任务信息后,根据Driver(ApplicationMaster)的资源配置信息要求,选择一个
nodeManager节点(有资源的,如果都有随机)来启动Driver(ApplicationMaster)程序,并且占用相对应资源

3- Driver(ApplicationMaster)启动后,执行main函数。首先创建SparkContext对象(底层是基于PY4J,识
别python的构建方式,将其映射为Java代码)。创建成功后,会向ResourceManager进行建立心跳机制,告知已经
启动成功了

4- 根据executor的资源配置要求,向ResourceManager通过心跳的方式申请资源,用于启动executor(提交的任
务的时候,可以自定义资源信息)

5- ResourceManager接收到资源申请后,根据申请要求,进行分配资源。底层是基于资源调度器来资源分配(默认
为Capacity容量调度)。然后将分配好的资源准备好,等待Driver(ApplicationMaster)拉取操作
executor1: node1 2个CPU 2GB内存
executor2: node3 2个CPU 2GB内存

6- Driver(ApplicationMaster)会定时询问是否准备好资源,一旦准备好,立即获取。根据资源信息连接对应的
节点,通知nodeManager启动executor,并占用相应资源。nodeManager对应的executor启动完成后,反向注册
回给Driver(ApplicationMaster)程序(已经启动完成)

7- Driver(ApplicationMaster)开始处理代码:
7.1 首先会加载所有的RDD相关的API(算子),基于算子之间的依赖关系,形成DAG执行流程图,划分stage阶
段,并且确定每个阶段应该运行多少个线程以及每个线程应该交给哪个executor来运行(任务分配)
7.2 Driver(ApplicationMaster)程序通知对应的executor程序, 来执行具体的任务
7.3 Executor接收到任务信息后, 启动线程, 开始执行处理即可: executor在执行的时候, 由于RDD代
码中有大量的Python的函数,Executor是一个JVM程序 ,无法解析Python函数, 此时会调用Python解析器,执
行函数, 并将函数结果返回给Executor
7.4 Executor在运行过程中,如果发现最终的结果需要返回给Driver(ApplicationMaster),直接返回
Driver(ApplicationMaster),如果不需要返回,直接输出 结束即可
7.5 Driver(ApplicationMaster)程序监听这个executor执行的状态信息,当Executor都执行完成后,
Driver(ApplicationMaster)认为任务运行完成了

8- 当任务执行完成后,Driver执行sc.stop()通知ResourceManager执行完成,ResourceManager回收资源,
Driver程序退出即可


http://www.ppmy.cn/news/1475280.html

相关文章

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例:利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例:利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例:利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

mysql之导入测试数据

运维时经常要这样:mysql改表名,创建一个一样的表不含数据,复制旧表几条数据进去 改变表的名字: RENAME TABLE old_table_name TO new_table_name; 这将把原来的表old_table_name重命名为new_table_name。 创建一个一样的表结构…

MES实时监控食品加工过程中各环节的安全

在实时监控食品加工过程中各环节的安全风险方面,万界星空科技的MES(制造执行系统)解决方案发挥了至关重要的作用。以下是具体如何通过MES系统实现实时监控食品加工过程中各环节安全风险的详细阐述: 一、集成传感器与实时监控 MES…

1.1 - Android启动概览

第一章 系统启动流程分析 第一节 Android启动概览 Android启动概览可以从多个方面进行描述,包括启动流程、关键组件及其作用等。以下是一个详细的Android启动概览: 一、启动流程 Android设备的启动流程大致可以分为以下几个阶段: 上电与引导…

数据结构实操代码题~考研

作者主页: 知孤云出岫 目录 数据结构实操代码题题目一:实现栈(Stack)题目二:实现队列(Queue)题目三:实现二叉搜索树(BST)题目四:实现链表(Linked…

虚幻引擎ue5如何调节物体锚点

当发现锚点不在物体上时,如何调节瞄点在物体上。 步骤1:按住鼠标中键拖动锚点,在透视图中多次调节锚点位置。 步骤2:在物体上点击鼠标右键点击-》锚定--》“设置为枢轴偏移”即可。

2974.最小数字游戏

1.题目描述 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏,游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下: 每一轮,Alice 先从 nums 中移除一个 …

机器学习扫盲:优化算法、损失函数、评估指标、激活函数、网络架构

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

MySQL8之mysql-community-server-debug的作用

mysql-community-server-debug是MySQL社区服务器的一个调试版本,它主要用于开发和调试MySQL数据库服务器。与标准的MySQL社区服务器版本相比,调试版本包含了额外的调试信息和工具,以帮助开发人员和数据库管理员诊断和解决MySQL服务器中的问题…

npm发布的包如何快速在cnpm上使用

npm发布的包如何快速在cnpm上使用 解决方案 前往淘宝npm镜像官网 搜索插件库并点击同步 等待一分钟即可查看最新版本

9.5 栅格图层符号化多波段彩色渲染

文章目录 前言多波段彩色渲染QGis设置为多波段彩色二次开发代码实现多波段彩色 总结 前言 介绍栅格图层数据渲染之多波段彩色渲染说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps 多波段彩色渲染 以“3420C_2010_327_RGB_LATLNG.tif”数据为例&#xff0c…

等保测评新趋势:应对数字化转型中的安全挑战

随着信息技术的飞速发展,数字化转型已成为企业提升竞争力、优化运营效率的重要手段。然而,这一转型过程中,企业也面临着前所未有的安全挑战。等保测评(信息安全等级保护测评)作为保障信息系统安全的重要手段&#xff0…

Python爬虫教程第5篇-使用BeautifulSoup查找html元素几种常用方法

文章目录 简介find()和find_all()字符串通过id查找通过属性查找通过.方式查找通过CSS选择器查找通过xpath查找正则表达自定义方法总结 简介 上一篇详细的介绍了如何使用Beautiful Soup的使用方法,但是最常用的还是如何解析html元素,这里再汇总介绍下查询…

C# modbus验证

窗体 还有添加的serialPort控件串口通信 设置程序配置 namespace CRC {public static class CRC16{/// <summary>/// CRC校验&#xff0c;参数data为byte数组/// </summary>/// <param name"data">校验数据&#xff0c;字节数组</param>///…

SpringBoot新手快速入门系列教程十一:基于Docker Compose部署一个最简单分布式服务项目

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 如果您还对于Docker或者Docker Compose不甚了解&#xff0c;可以劳烦移步到我之前的教程&#xff1a; SpringBoot新手快速入门系列教程九&#xff1a;基于docker容器&#xff…

ZGC的流程图

GC标记过程 1、初始标记 扫描所有线程栈的根节点&#xff0c;然后再扫描根节点直接引用的对象并进行标记。这个阶段需要停顿所有的应用线程&#xff08;STW&#xff09;&#xff0c;但由于只扫描根对象直接引用的对象&#xff0c;所以停顿时间很短。停顿时间高度依赖根节点的数…

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年&#xff0c;随着人工智能继续快速发展并融入几乎所有行业&#xff0c;创建一家人工智能初创公司将带来巨大的机遇。然而&#xff0c;在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面&#xff0c;人工智能初创公司也面临着相当大的挑战。 让我来…

LDAPWordlistHarvester:基于LDAP数据的字典生成工具

关于LDAPWordlistHarvester LDAPWordlistHarvester是一款功能强大的字典列表生成工具&#xff0c;该工具可以根据LDAP中的详细信息生成字典列表文件&#xff0c;广大研究人员随后可以利用生成的字典文件测试目标域账号的非随机密码安全性。 工具特征 1、支持根据LDAP中的详细信…

利用宝塔安装一套linux开发环境

更新yum&#xff0c;并且更换阿里镜像源 删除yum文件 cd /etc/yum.repos.d/ 进入yum核心目录 ls sun.repo rm -rf * 删除之前配置的本地源 ls 配置阿里镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 配置扩展包 wge…

DP(3) | 0-1背包 | Java | 卡码 46 LeetCode 416 做题总结

代码随想录笔记 AcWing-背包九讲专题 一道例题 dd大牛背包9讲 背包笔记 对于面试的话&#xff0c;其实掌握01背包&#xff0c;和完全背包&#xff0c;就够用了&#xff0c;最多可以再来一个多重背包。 01背包&#xff1a;n种物品&#xff0c;每种物品只有 1 个&#xff0c;每…