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


相关文章
|
1月前
|
缓存 监控 Java
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
26 1
|
2月前
|
安全 程序员 编译器
动态内存管理学习分享
动态内存管理学习分享
45 0
|
2月前
|
存储 监控 算法
【C++ 软件设计思路】高效管理历史任务记录:内存与磁盘结合的策略解析
【C++ 软件设计思路】高效管理历史任务记录:内存与磁盘结合的策略解析
65 0
|
2月前
|
分布式计算 API Spark
Spark学习--day05、SparkCore电商网站实操、SparkCore-工程代码
Spark学习--day05、SparkCore电商网站实操、SparkCore-工程代码
70 11
|
5天前
|
机器学习/深度学习 算法 Linux
xenomai内核解析--实时内存管理--xnheap
Xenomai是一个实时操作系统(RTOS)层,用于Linux,旨在提供确定性的任务调度和服务。其内存管理机制包括一个名为xnheap的内存池,确保内存分配和释放的时间确定性,以满足硬实时系统的严格需求。
12 0
xenomai内核解析--实时内存管理--xnheap
|
8天前
|
缓存 运维 算法
深入理解Linux内核的虚拟内存管理
【5月更文挑战第6天】 在现代操作系统中,尤其是类Unix系统如Linux中,虚拟内存管理是一项核心功能,它不仅支持了多任务环境,还提供了内存保护和抽象。本文将深入探讨Linux操作系统的虚拟内存子系统,包括分页机制、虚拟地址空间布局、页面置换算法以及内存分配策略。通过对这些概念的剖析,我们旨在为读者揭示Linux如何有效地管理和优化物理内存资源,并确保系统的稳定运行与高效性能。
|
12天前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
24 3
|
14天前
|
算法 安全 Linux
深度解析:Linux内核内存管理机制
【4月更文挑战第30天】 在操作系统领域,内存管理是核心功能之一,尤其对于多任务操作系统来说更是如此。本文将深入探讨Linux操作系统的内核内存管理机制,包括物理内存的分配与回收、虚拟内存的映射以及页面替换算法等关键技术。通过对这些技术的详细剖析,我们不仅能够理解操作系统如何高效地利用有限的硬件资源,还能领会到系统设计中的性能与复杂度之间的权衡。
|
2月前
|
缓存 监控 算法
Linux内核的SLAB内存管理机制
Linux内核的SLAB内存管理机制
110 4
|
2月前
|
SQL 分布式计算 Java
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
140 1