这是本人的学习过程,看到的同道中人祝福你们心若有所向往,何惧道阻且长;
但愿每一个人都像星星一样安详而从容的,不断沿着既定的目标走完自己的路程;
最后想说一句君子不隐其短,不知则问,不能则学。
如果大家觉得我写的还不错的话希望可以收获关注、点赞、收藏(谢谢大家)
一、源码全流程
1.1 Spark提交流程(YarnCluster)
1.2 Spark通讯架构
1.3 Spark任务划分
1.4 任务调度
1.5 Shuffle原理
1、HashShuffle流程
2、优化后的HashShuffle流程(共用Buffer)
3、SortShuffle流程
4、bypassShuffle流程
二、环境准备及提交流程
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
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中通信框架的发展
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底层通信原理
3、任务的执行
3.1 概述
3.1.1 任务切分和任务调度原理
任务切分
任务调度
3.1.2 本地化调度
任务分配原则:根据每个Task的优先位置,确定Task的Locality(本地化)级别,本地化一共有五种,优先级由高到低的顺序。
移动数据不如移动计算。
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了。