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了。


相关文章
|
2月前
|
存储 缓存 分布式计算
Spark任务OOM问题如何解决?
大家好,我是V哥。在实际业务中,Spark任务常因数据量过大、资源分配不合理或代码瓶颈导致OOM(Out of Memory)。本文详细分析了各种业务场景下的OOM原因,并提供了优化方案,包括调整Executor内存和CPU资源、优化内存管理策略、数据切分及减少宽依赖等。通过综合运用这些方法,可有效解决Spark任务中的OOM问题。关注威哥爱编程,让编码更顺畅!
212 3
|
4月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何开发ODPS Spark任务
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
77 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
6月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
87 0
|
6月前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
55 0
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
59 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
存储 Java Linux
【JVM】JVM执行流程和内存区域划分
【JVM】JVM执行流程和内存区域划分
50 1
|
3月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
49 5
|
2月前
|
消息中间件 分布式计算 Kafka
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
47 0
|
3月前
|
SQL 机器学习/深度学习 分布式计算
Spark适合处理哪些任务?
【9月更文挑战第1天】Spark适合处理哪些任务?
209 3