0


Spark最后一课

1.Spark的提交过程(YarnCluster)

1.命令输入脚本启动,启动submit任务
在这里插入图片描述
2.解析参数
看是cluster还是yarn单点模式

3.创建客户端YarnClusterApplication
4.封装提交命令交给RM
5.RM在NM上启动ApplicationMaster(AM) 注意AM消耗的资源都是container的
6.AM根据参数启动Driver并且初始化SparkContext
7.Driver向RM申请资源,(YarnRM Client)
8.RM返回资源可用列表
9.Driver调用资源,找到空闲的NM,进行Executor注册,然后进行任务的切分和分配.
10.Executor 启动线程池,根据优先算法依次启动task线程.

在这里插入图片描述

2.任务的调度

如果是Client模式,则Driver就是本机了,Executor 会直接交互本机,远程访问提交,不能停止,同时所有Executor会交互本机,而本机资源不足,会导致系统和网络崩溃.
根据宽依赖进行Stage划分,根据分区做Task划分在这里插入图片描述
关于本地化调度
其实就是由近到远,依次尝试
如何由近到远?按照等级进行尝试,从高等级到低等级,降级机制.如何避免多次访问通一个节点? 黑名单机制

在这里插入图片描述
同一个进程-同一个节点->同一个机架->无所谓->任意地方,不在一个机架

3. Shuffle的原理

在这里插入图片描述
在这里插入图片描述

1. shuffle为什么那么慢?

因为shuffle要进行排序聚合操作,而且还要落盘

2.针对问题,如何优化?

  1. 针对排序聚合操作 在shuffle之前进行提前聚合,减少shuffle聚合的数据量,达到加速
  2. 落盘操作 增大缓冲区大小和溢出占比,减少溢写次数.
  3. 直接不排序

3.1 HashShuffle

一个task的一个分区一个文件
在这里插入图片描述

3.2HashShuffle的第二版流程

一个核按分区数划分文件数
在这里插入图片描述

3.3 SortShuffle

全部写入到一个文件中,保证文件内容有序,同时,使用稀疏索引来确定数据的位置
在这里插入图片描述

3.4bypassShuffle

对比3.3直接忽略排序
要求

  • 当reducetask数量小于等于200才能使用
  • 不是聚合类的shuffle(reduceByKey) groupby可以 通过hash不进行排序,存入

4.内存

堆内内存: JVM管理的内存
堆外内存: 操作系统管理的内存

JVM默认站 1/64 最大 1/4 超出则内存溢出

1.JVM三大块:

堆:存储程序运行时构建的对象(引用)
栈: 存储方法执行的内容(压栈,栈帧), 与JAVA的栈一致
方法区: 存储类的全部信息

2.关于堆的考虑

根据存活时长存储在不同的
新生代:
老年代
轻量级 Minor GC 对应新生代
重量级 Major GC 对应老年代

当新生代满了后,触发Minor GC,按时间排序,将旧对象放入老年代
老年代满了之后,触发Major GC,如果还不能解决问题,就出现堆内存溢出

3.Spark的内存分块

Storange 存储 广播变量
Execution 执行 shuffle sort
Other 其他 元数据 SparkContest 框架中的类对象

Yarn是将资源分配给节点(Driver,Executor),然后每个节点中资源的调配,就是由Spark自己决定


本文转载自: https://blog.csdn.net/qq_42265608/article/details/132501896
版权归原作者 叫我莫言鸭 所有, 如有侵权,请联系我们删除。

“Spark最后一课”的评论:

还没有评论