Spark最后一课

1.Spark的提交过程(YarnCluster)

1.命令输入脚本启动,启动submit任务
Spark最后一课_第1张图片
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线程.

Spark最后一课_第2张图片

2.任务的调度

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

Spark最后一课_第4张图片
同一个进程-同一个节点->同一个机架->无所谓->任意地方,不在一个机架

3. Shuffle的原理

在这里插入图片描述
Spark最后一课_第5张图片

1. shuffle为什么那么慢?

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

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

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

3.1 HashShuffle

一个task的一个分区一个文件
Spark最后一课_第6张图片

3.2HashShuffle的第二版流程

一个核按分区数划分文件数
Spark最后一课_第7张图片

3.3 SortShuffle

全部写入到一个文件中,保证文件内容有序,同时,使用稀疏索引来确定数据的位置
Spark最后一课_第8张图片

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自己决定

你可能感兴趣的:(大数据,Spark,spark,大数据,分布式)