0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

spark运行的基本流程

京东云 来源:jf_75140285 作者:jf_75140285 2024-07-02 10:31 次阅读

前言:

由于最近对spark的运行流程非常感兴趣,所以阅读了《Spark大数据处理:技术、应用与性能优化》一书。通过这本书的学习,了解了spark的核心技术、实际应用场景以及性能优化的方法。本文旨在记录和分享下spark运行的基本流程。

一、spark的基础组件及其概念

1. ClusterManager

在Standalone模式中即为Master,控制整个集群,监控Worker。在YARN模式中为资源管理器。

2. Application

用户自定义的spark程序, 用户提交后, Spark为App分配资源, 将程序转换并执行。

3. Driver

在Spark中,driver是一个核心概念,指的是Spark应用程序的主进程,也称为主节点。负责运行Application的main( ) 函数并创建SparkContext。

4. Worker

从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。

5. Executor

执行器,在Worker节点上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。

6. RDD Graph

RDD是spark的核心结构, 可以通过一系列算子进行操作( 主要有Transformation和Action操作) 。 当RDD遇到Action算子时, 将之前的所有算子形成一个有向无环图( DAG) , 也就是RDD Graph。 再在Spark中转化为Job, 提交到集群执行。一个App中可以包含多个Job。

7. Job

一个RDD Graph触发的作业, 往往由Spark Action算子触发, 在SparkContext中通过runJob方法向Spark提交Job。

8. Stage

每个Job会根据RDD的宽依赖关系被切分很多Stage, 每个Stage中包含一组相同的Task, 这一组Task也叫TaskSet。

9. Task

一个分区对应一个Task, Task执行RDD中对应Stage中包含的算子。 Task被封装好后放入Executor的线程池中执行。

二、spark架构

spark架构采用了分布式计算中的Master-Slave模型。Master作为整个集群的控制器,负责整个集群的正常运行;Worker相当于是计算节点,接收主节点命令与进行状态汇报;Executor负责任务的执行;Client作为用户的客户端负责提交应用,Driver负责控制一个应用的执行。





如图所示,spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个spark应用的执行过程中,Driver和Worker是两个重要角色。Driver程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。

三、Spark的工作机制

1. Spark的整体流程

Client提交应用,Master找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAG Scheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。





如图所示,在spark应用中,整个执行流程在逻辑上会形成有向无环图。Action算子触发之后,将所有累计的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。spark根据RDD之间不同的依赖关系切分形成不同的阶段(stage),一个阶段包含一系列函数执行流水线。途中A、B、C、D、E、F、分别代表不同的RDD,RDD内的方框代表分区。数据从HDFS输入spark,形成RDD A和RDD C,RDD C上执行map操作,转换为RDD D,RDD B和RDD E执行Join操作,转换为F。而在B和E连接转化为F的过程中又会执行Shuffle,最后RDD F通过函数saveAsSequenceFile输出并保存到HDFS中。

2. Stage的划分

如上面这个运行流程所示,在 Apache Spark 中,一个作业(Job)通常会被划分为多个阶段(Stage),每个阶段包含一组并行的任务(Task)。这种划分主要是基于数据宽窄依赖进行的,以便更有效地进行任务调度和执行。以下是关于 Spark 中 Stage 划分的一些关键点:

宽窄依赖

窄依赖(Narrow Dependency):父 RDD 的每个分区只会被一个子 RDD 的分区使用,或者多个子 RDD 分区计算时都使用同一个父 RDD 分区。窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区,不会造成网络之间的数据混洗。

宽依赖(Wide Dependency):父 RDD 的每个分区都可能被多个子 RDD 分区所使用,会引起 shuffle。

Stage的划分

Spark 根据 RDD 之间的宽窄依赖关系来划分 Stage。遇到宽依赖就划分一个 Stage,每个 Stage 里面包含多个 Task,Task 的数量由该 Stage 最后一个 RDD 的分区数决定。一个 Stage 内部的多个 Task 可以并行执行,而 Stage 之间是串行执行的。只有当一个 Stage 中的所有 Task 都计算完成后,才会开始下一个 Stage 的计算。

Shuffle 与 Stage 边界

当 Spark 遇到一个宽依赖(如 `reduceByKey`、`groupBy` 等操作)时,它需要在该操作之前和之后分别创建一个新的 Stage。这是因为宽依赖需要 shuffle 数据,而 shuffle 通常涉及磁盘 I/O,因此将宽依赖作为 Stage 之间的边界可以提高效率。

3. Stage和Task调度方式

Stage的调度是由DAGScheduler完成的。 由RDD的有向无环图DAG切分出了Stage的有向无环图DAG。 Stage的DAG通过最后执行Stage为根进行广度优先遍历, 遍历到最开始执行的Stage执行, 如果提交的Stage仍有未完成的父母Stage, 则Stage需要等待其父Stage执行完才能执行。 同时DAGScheduler中还维持了几个重要的Key-Value集合构, 用来记录Stage的状态, 这样能够避免过早执行和重复提交Stage。waitingStages中记录仍有未执行的父母Stage, 防止过早执行。 runningStages中保存正在执行的Stage, 防止重复执行。failedStages中保存执行失败的Stage, 需要重新执行。

每个Stage包含一组并行的Task,这些Task被组织成TaskSet(任务集合)。DAGScheduler将划分好的TaskSet提交给TaskScheduler。TaskScheduler是负责Task调度和集群资源管理的组件。TaskScheduler通过TaskSetManager来管理每个TaskSet。TaskSetManager会跟踪和控制其管辖的Task的执行,包括任务的启动、状态监控和失败重试等。当TaskSet被提交到TaskScheduler时,TaskScheduler会决定在哪些Executor上运行Task,并通过集群管理器(如YARN、Mesos或Spark Standalone)将Task分发到相应的节点上执行。Executor接收到Task后,会在其管理的线程池中执行任务。执行过程中,Task的状态会不断更新,并通过状态更新机制通知TaskSetManager。TaskSetManager根据接收到的状态更新来跟踪Task的执行情况,如遇到任务失败,会触发重试机制直至达到设定的重试次数。

当所有Task都执行完成后,TaskScheduler会通知DAGScheduler,并由DAGScheduler负责触发后续Stage的执行(如果存在)。

4. Shuffle机制

为什么spark计算模型需要Shuffle过程? 我们都知道, spark计算模型是在分布式的环境下计算的, 这就不可能在单进程空间中容纳所有的计算数据来进行计算, 这样数据就按照Key进行分区, 分配成一块一块的小分区, 打散分布在集群的各个进程的内存空间中, 并不是所有计算算子都满足于按照一种方式分区进行计算。 例如, 当需要对数据进行排序存储时, 就有了重新按照一定的规则对数据重新分区的必要, Shuffle就是包裹在各种需要重分区的算子之下的一个对数据进行重新组合的过程。



如图, 整个Job分为Stage1~Stage3, 3个Stage。首先从最上端的Stage2、 Stage3执行, 每个Stage对每个分区执行变换( transformation) 的流水线式的函数操作, 执行到每个Stage最后阶段进行Shuffle Write,将数据重新根据下一个Stage分区数分成相应的Bucket, 并将Bucket最后写入磁盘。 这个过程就是Shuffle Write阶段。执行完Stage2、 Stage3之后, Stage1去存储有Shuffle数据节点的磁盘Fetch需要的数据, 将数据Fetch到本地后进行用户定义的聚集函数操作。 这个阶段叫Shuffle Fetch, Shuffle Fetch包含聚集阶段。 这样一轮一轮的Stage之间就完成了Shuffle操作。

四、结语

在阅读《Spark大数据处理:技术、应用与性能优化》一书后,我大概了解了spark的运行机制及原理。上文仅是做了一个简单的总结,而且并没有对一些细节进行深入解读。在原书中有着十分详细的介绍,包含其容错、IO、网络等机制以及从源码解析spark的运行流程,而且书中通过大量实际案例,展示了如何在具体应用中使用Spark进行数据处理、分析和挖掘,使理论与实践相结合,大家如有兴趣可自行阅读。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 大数据
    +关注

    关注

    64

    文章

    8804

    浏览量

    136985
  • SPARK
    +关注

    关注

    1

    文章

    105

    浏览量

    19819
收藏 人收藏

    评论

    相关推荐

    spark为什么比mapreduce快?

    spark为什么比mapreduce快? 首先澄清几个误区: 1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是错误的 2;DAG计算模型
    的头像 发表于 09-06 09:45 97次阅读

    变电所运行维护的流程措施

    为了确保电网的稳定运行和高效供电,变电所的运行与维护工作至关重要,这些工作不仅需要专业的技术知识,还需要细致的操作规程和严格的管理制度。以下详细介绍变电所运行维护的几个关键环节及其执行标准和措施
    的头像 发表于 08-30 11:05 177次阅读

    广汽能源与泰国Spark EV签订合作框架协议

    近日,广汽能源科技(泰国)有限公司与Spark EV Co.Ltd.宣布达成重要合作,双方共同签署了一项合作框架协议,旨在泰国境内全面布局并运营超级充电场站,为新能源汽车的普及与发展注入强劲动力。
    的头像 发表于 07-19 17:08 758次阅读

    Spark基于DPU的Native引擎算子卸载方案

    1.背景介绍 Apache Spark(以下简称Spark)是一个开源的分布式计算框架,由UC Berkeley AMP Lab开发,可用于批处理、交互式查询(Spark SQL)、实时流处理
    的头像 发表于 06-28 17:12 319次阅读
    <b class='flag-5'>Spark</b>基于DPU的Native引擎算子卸载方案

    关于Spark的从0实现30s内实时监控指标计算

    前言 说起Spark,大家就会自然而然地想到Flink,而且会不自觉地将这两种主流的大数据实时处理技术进行比较。然后最终得出结论:Flink实时性大于Spark。 的确,Flink中的数据计算
    的头像 发表于 06-14 15:52 228次阅读

    CT分析仪试验运行流程——每日了解电力知识

    今天武汉摩恩智能电气有限公司带大家了解一下MEVA-I CT分析仪。 MEVA-I CT分析仪试验运行的一般流程: 仪器的软件运行可以分为“等待新建试验”,“等待试验”,“查看结果”,“运行
    的头像 发表于 05-22 09:55 247次阅读
    CT分析仪试验<b class='flag-5'>运行</b><b class='flag-5'>流程</b>——每日了解电力知识

    如何利用DPU加速Spark大数据处理? | 总结篇

    SSD速度通过NVMe接口得到了大幅提升,并且网络传输速率也进入了新的高度,但CPU主频发展并未保持同等步调,3GHz左右的核心频率已成为常态。 在当前背景下Apache Spark等大数据处理工具中,尽管存储和网络性能的提升极大地减少了数据读取和传输的时间消耗,但
    的头像 发表于 04-02 13:45 829次阅读
    如何利用DPU加速<b class='flag-5'>Spark</b>大数据处理? | 总结篇

    Spark基于DPU Snappy压缩算法的异构加速方案

    一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎,是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些不同之处使
    的头像 发表于 03-26 17:06 579次阅读
    <b class='flag-5'>Spark</b>基于DPU Snappy压缩算法的异构加速方案

    RDMA技术在Apache Spark中的应用

    背景介绍 在当今数据驱动的时代,Apache Spark已经成为了处理大规模数据集的首选框架。作为一个开源的分布式计算系统,Spark因其高效的大数据处理能力而在各行各业中广受欢迎。无论是金融服务
    的头像 发表于 03-25 18:13 1345次阅读
    RDMA技术在Apache <b class='flag-5'>Spark</b>中的应用

    基于DPU和HADOS-RACE加速Spark 3.x

    背景简介 Apache Spark(下文简称Spark)是一种开源集群计算引擎,支持批/流计算、SQL分析、机器学习、图计算等计算范式,以其强大的容错能力、可扩展性、函数式API、多语言支持(SQL
    的头像 发表于 03-25 18:12 1145次阅读
    基于DPU和HADOS-RACE加速<b class='flag-5'>Spark</b> 3.x

    米哈游大数据云原生实践

    近年来,容器、微服务、Kubernetes 等各项云原生技术的日渐成熟,越来越多的公司开始选择拥抱云原生,并开始将 AI、大数据等类型的企业应用部署运行在云原生之上。以 Spark 为例,在云上运行
    的头像 发表于 01-09 10:41 456次阅读
    米哈游大数据云原生实践

    Blaze: 用Rust重写Spark执行层,平均提升30%算力

    随着机器硬件的发展,RAM的价格也大幅降低,这时Spark提出了弹性分布式数据集(RDD),这是一种分布式内存抽象,可以让程序员以容错的方式在大型集群上执行内存计算。
    的头像 发表于 11-22 17:46 798次阅读
    Blaze: 用Rust重写<b class='flag-5'>Spark</b>执行层,平均提升30%算力

    python如何查看运行过程

    Python是一门高级编程语言,可以用于开发各种类型的应用程序、网站和数据分析。当我们编写并运行Python程序时,有时候需要了解程序执行的详细过程,以便调试代码和理解程序的执行流程。下面将介绍几种
    的头像 发表于 11-22 11:13 1517次阅读

    PLC现场安装、调试全流程实战经验

    深入了解设计资料、对系统工艺流程,特别是工艺对各生产设备的控制要求要有全面的了解,在此基础上,按子系统绘制工艺流。程联锁图、系统功能图、系统运行逻辑框图、这将有助于对系统运行逻辑的深刻理解,是前期技术准备的重要环节。
    的头像 发表于 11-14 16:38 815次阅读

    ATF启动流程介绍

    一、BL32(TEE OS)的准备 ATF启动流程 ATF流程 ATF冷启动实现分为5个步骤: • BL1 - AP Trusted ROM,一般为BootRom。 • BL2 - Trusted
    的头像 发表于 11-02 17:51 1008次阅读
    ATF启动<b class='flag-5'>流程</b>介绍