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月前
|
分布式计算 API Spark
Spark学习--day05、SparkCore电商网站实操、SparkCore-工程代码
Spark学习--day05、SparkCore电商网站实操、SparkCore-工程代码
66 11
|
1月前
|
SQL 分布式计算 Java
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
107 1
|
1月前
|
分布式计算 Spark 索引
Spark学习---day07、Spark内核(Shuffle、任务执行)
Spark学习---day07、Spark内核(源码提交流程、任务执行)
41 2
|
1月前
|
分布式计算 监控 Java
Spark学习---day06、Spark内核(源码提交流程、任务执行)
Spark学习---day06、Spark内核(源码提交流程、任务执行)
41 2
|
1月前
|
分布式计算 Spark
Spark【Spark学习大纲】简介+生态+RDD+安装+使用(xmind分享)
【2月更文挑战第14天】Spark【Spark学习大纲】简介+生态+RDD+安装+使用(xmind分享)
32 1
|
1月前
|
分布式计算 Spark
Spark学习--day05、累加器
Spark学习--day05、累加器
16 1
|
1月前
|
存储 JSON 监控
Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
【2月更文挑战第30天】Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
14 1
|
1月前
|
存储 C语言
C语言--------数据在内存中的存储
C语言--------数据在内存中的存储
26 0
|
1天前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
6 0
|
1天前
|
存储
数据在内存中的存储之整数存储
数据在内存中的存储之整数存储
8 0

热门文章

最新文章