Spark学习---7、Spark内核(源码提交流程、任务执行、Shuffle、内存管理)(一)

简介: Spark学习---7、Spark内核(源码提交流程、任务执行、Shuffle、内存管理)(一)

这是本人的学习过程,看到的同道中人祝福你们心若有所向往,何惧道阻且长;

但愿每一个人都像星星一样安详而从容的,不断沿着既定的目标走完自己的路程;

最后想说一句君子不隐其短,不知则问,不能则学。

如果大家觉得我写的还不错的话希望可以收获关注、点赞、收藏(谢谢大家)

一、源码全流程

1.1 Spark提交流程(YarnCluster)


e822fca504de444e8dab4bac71d56e6c.png

1.2 Spark通讯架构


e95ed924722c4057b925167bf612f9ed.png

1.3 Spark任务划分

8f5ced2308c640a9a4b57e5a302c5196.png

1.4 任务调度

9c07fdfe1bee4bcb96a119077815b80a.png

1.5 Shuffle原理

1、HashShuffle流程

52006d1442974252b96b7c7ccc94af73.png


2、优化后的HashShuffle流程(共用Buffer)

c1249cb5e98440b48db21d64f9f75b0a.png

3、SortShuffle流程

f7288d65648c4d6bbc8a99cfc570b520.png

4、bypassShuffle流程

84e2f261d5034f66a4a47d6ff816f528.png

二、环境准备及提交流程

2.1 程序起点


1、spark-3.3.0-bin-hadoop3\bin\spark-submit.cmd

=> cmd /V /E /C “”%~dp0spark-submit2.cmd" %"

2、spark-submit2.cmd

=> set CLASS=org.apache.spark.deploy.SparkSubmit

“%~dp0spark-class2.cmd” %CLASS% %

3、spark-class2.cmd

=> %SPARK_CMD%

4、在spark-class2.cmd文件中增加打印%SPARK_CMD%语句

echo %SPARK_CMD%
%SPARK_CMD%

5、在spark-3.3.0-bin-hadoop3\bin目录上执行cmd命令

6、进入命令行窗口,输入

spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ./examples/jars/spark-examples_2.12-3.3.0.jar 10

f7f1c796587e45409cb58303800d12c5.png

7、发现底层执行的命令为

java -cp  org.apache.spark.deploy.SparkSubmit

说明:java -cp和 -classpath一样,是指定类运行所依赖其他类的路径。

8、执行java -cp 就会开启JVM虚拟机,在虚拟机上开启SparkSubmit进程,然后开始执行main方法

java -cp =》开启JVM虚拟机 =》开启Process(SparkSubmit)=》程序入口SparkSubmit.main

9、在IDEA中全局查找(ctrl + n):org.apache.spark.deploy.SparkSubmit,找到SparkSubmit的伴生对象,并找到main方法

override def main(args: Array[String]): Unit = {
    val submit = new SparkSubmit() {
... ...
    }
}

2.2 Spark组件通信

2.2.1 Spark中通信框架的发展

f45d63f9680542f59250ebedec58d22f.png

1.2.2 三种通信方式

1、三种通信方式

BIO:阻塞式IO Spark底层采用Netty

NIO:非阻塞式IO Netty:支持NIO和Epoll模式

AIO:异步非阻塞式IO 默认采用NIO

2、举例说明

比如去饭店吃饭,老板说你前面有四个人,需要等一会;

(1)如果你在桌子面前一直等着,就是阻塞式IO–BIO。

(2)如果你和老板说,饭先做着,我先去打篮球。在打篮球的过程中ing,时不时回来看一下饭是否做好,就是非阻塞式IO-NIO

(3)先给老板说,我去打篮球,一个小时后给我送到指定位置,就是异步非阻塞式-AIO。

3、注意:

Linux对AIO支持的不够好,Windows支持AIO很好

Linux采用Epoll方式模仿AIO

2.2.3 Spark底层通信原理

2ab79435499549fb893e2b91c9ae3510.png

00000000.jpg

3、任务的执行

3.1 概述

3.1.1 任务切分和任务调度原理

任务切分

b7df4c4e4fc84285b4fbd63a9e078d48.png

任务调度

946b55b0fc5a4f44bc23a68d93816ade.png

3.1.2 本地化调度

任务分配原则:根据每个Task的优先位置,确定Task的Locality(本地化)级别,本地化一共有五种,优先级由高到低的顺序。

移动数据不如移动计算。

image.png

3.1.3 失败重试与黑名单机制

除了选择合适的Task调度运行外,还需要监控Task的执行状态,前面也提到过,与外部打交道的是SchedulerBackend,Task被提交到Executor启动执行后,Executor会将执行状态上报给SchedulerBackend,SchedulerBackend则告诉TaskScheduler,TaskScheduler找到该Task对应的TaskSetManager,并通知到该TaskSetManager,这样TaskSetManager就知道Task的失败与成功状态。

对于失败的Task,会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的Task池子中,否则整个Application失败。

在记录Task失败次数过程中,会记录它上一次失败所在的Executor和Host,这样下次再调度这个Task时,会使用黑名单机制,避免它被调度到上一次失败的节点上,起到一定的容错作用。黑名单记录Task上一次失败所在的ExecutorID和Host,以及其对应的“拉黑”时间,“拉黑”时间是指这段时间内不要再往这个节点上调度这个Task了。


目录
打赏
0
0
0
1
64
分享
相关文章
Spark 与 MapReduce 的 Shuffle 的区别?
MapReduce 和 Spark 在 Shuffle 过程中有显著区别。MapReduce 采用两阶段模型,中间数据写入磁盘,I/O 开销大;而 Spark 使用基于内存的多阶段执行模型,支持操作合并和内存缓存,减少 I/O。Spark 的 RDD 转换优化减少了 Shuffle 次数,提升了性能。此外,Spark 通过 lineage 实现容错,资源管理更灵活,整体大数据处理效率更高。
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
【JVM】JVM执行流程和内存区域划分
【JVM】JVM执行流程和内存区域划分
113 1
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
109 0
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
142 0
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
215 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问