千家信息网

如何进行Spark底层原理的解析

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,如何进行Spark底层原理的解析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Spark简介Apache Spark是用于大规模数据处理
千家信息网最后更新 2025年12月03日如何进行Spark底层原理的解析

如何进行Spark底层原理的解析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Spark简介

Apache Spark是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性高可伸缩性,允许用户将Spark部署在大量硬件之上,形成集群。

Spark源码从1.x的40w行发展到现在的超过100w行,有1400多位大牛贡献了代码。整个Spark框架源码是一个巨大的工程。下面我们一起来看下spark的底层执行原理。

Spark运行流程

Spark运行流程

具体运行流程如下:

  1. SparkContext 向资源管理器注册并向资源管理器申请运行Executor

  2. 资源管理器分配Executor,然后资源管理器启动Executor

  3. Executor 发送心跳至资源管理器

  4. SparkContext 构建DAG有向无环图

  5. 将DAG分解成Stage(TaskSet)

  6. 把Stage发送给TaskScheduler

  7. Executor 向 SparkContext 申请 Task

  8. TaskScheduler 将 Task 发送给 Executor 运行

  9. 同时 SparkContext 将应用程序代码发放给 Executor

  10. Task 在 Executor 上运行,运行完毕释放所有资源

1. 从代码角度看DAG图的构建
Val lines1 = sc.textFile(inputPath2).map(...).map(...)Val lines2 = sc.textFile(inputPath3).map(...)Val lines3 = sc.textFile(inputPath4)Val dtinone1 = lines2.union(lines3)Val dtinone = lines1.join(dtinone1)dtinone.saveAsTextFile(...)dtinone.filter(...).foreach(...)

构建DAG图

Spark内核会在需要计算发生的时刻绘制一张关于计算路径的有向无环图,也就是如上图所示的DAG。

Spark 的计算发生在RDD的Action操作,而对Action之前的所有Transformation,Spark只是记录下RDD生成的轨迹,而不会触发真正的计算

2. 将DAG划分为Stage核心算法

一个Application可以有多个job多个Stage:

Spark Application中可以因为不同的Action触发众多的job,一个Application中可以有很多的job,每个job是由一个或者多个Stage构成的,后面的Stage依赖于前面的Stage,也就是说只有前面依赖的Stage计算完毕后,后面的Stage才会运行。

划分依据:

Stage划分的依据就是宽依赖,像reduceByKey,groupByKey等算子,会导致宽依赖的产生。

回顾下宽窄依赖的划分原则:
窄依赖:父RDD的一个分区只会被子RDD的一个分区依赖。即一对一或者多对一的关系,可理解为独生子女。 常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned)等。
宽依赖:父RDD的一个分区会被子RDD的多个分区依赖(涉及到shuffle)。即一对多的关系,可理解为超生。 常见的宽依赖有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned)等。

核心算法:回溯算法

从后往前回溯/反向解析,遇到窄依赖加入本Stage,遇见宽依赖进行Stage切分。

Spark内核会从触发Action操作的那个RDD开始从后往前推,首先会为最后一个RDD创建一个Stage,然后继续倒推,如果发现对某个RDD是宽依赖,那么就会将宽依赖的那个RDD创建一个新的Stage,那个RDD就是新的Stage的最后一个RDD。
然后依次类推,继续倒推,根据窄依赖或者宽依赖进行Stage的划分,直到所有的RDD全部遍历完成为止。

3. 将DAG划分为Stage剖析

DAG划分Stage

一个Spark程序可以有多个DAG(有几个Action,就有几个DAG,上图最后只有一个Action(图中未表现),那么就是一个DAG)

一个DAG可以有多个Stage(根据宽依赖/shuffle进行划分)。

同一个Stage可以有多个Task并行执行(task数=分区数,如上图,Stage1 中有三个分区P1、P2、P3,对应的也有三个 Task)。

可以看到这个DAG中只reduceByKey操作是一个宽依赖,Spark内核会以此为边界将其前后划分成不同的Stage。

同时我们可以注意到,在图中Stage1中,从textFile到flatMap到map都是窄依赖,这几步操作可以形成一个流水线操作,通过flatMap操作生成的partition可以不用等待整个RDD计算结束,而是继续进行map操作,这样大大提高了计算的效率

4. 提交Stages

调度阶段的提交,最终会被转换成一个任务集的提交,DAGScheduler通过TaskScheduler接口提交任务集,这个任务集最终会触发TaskScheduler构建一个TaskSetManager的实例来管理这个任务集的生命周期,对于DAGScheduler来说,提交调度阶段的工作到此就完成了。

而TaskScheduler的具体实现则会在得到计算资源的时候,进一步通过TaskSetManager调度具体的任务到对应的Executor节点上进行运算。

任务总体调度

Spark运行架构特点

1. Executor进程专属

每个Application获取专属的Executor进程,该进程在Application期间一直驻留,并以多线程方式运行Tasks

Spark Application不能跨应用程序共享数据,除非将数据写入到外部存储系统。如图所示:

支持多种资源管理器

3. Job提交就近原则

提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好是在同一个Rack(机架)里,因为Spark Application运行过程中SparkContext和Executor之间有大量的信息交换;

如果想在远程集群中运行,最好使用RPC将SparkContext提交给集群,不要远离Worker运行SparkContext

4. 移动程序而非移动数据的原则执行

移动程序而非移动数据的原则执行,Task采用了数据本地性和推测执行的优化机制

关键方法:taskIdToLocations、getPreferedLocations。

看完上述内容,你们掌握如何进行Spark底层原理的解析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

运行 数据 资源 多个 管理 任务 资源管理 程序 原则 移动 调度 原理 底层 上图 代码 内核 同时 就是 方法 流程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 守护网络安全的新颖题目 中南工大网络安全专业 软件开发接单平台排名 泰安58同城招聘软件开发 苏州软件开发公司有哪些 四月星空网络技术有限公司 计算机网络技术试卷2018 与网络安全性相关的法律 云翼平台数据库核心组件 网络安全威胁ppt 成都有网络安全培训班吗 河南新乡服务器地址虚拟主机 区县网络安全调研报告 网络技术基础素质目标 米米解说我的世界服务器怎么进 无法连接至授权服务器稍后再试 网络安全iec标准 机房 服务器管理与维护 枣庄管理系统软件开发解决方案 数据采集并部署到服务器 服务器修改权限拒绝访问 服务器硬盘挂载后如何设置 网络安全竞技平台 充电提示音软件开发 苹果平板服务器错误怎么办 云翼平台数据库核心组件 群晖918安装数据库 如何打开t3数据库 保险公司有投保人的数据库吗 明日之后连接服务器怎么回事
0