赞
踩
"宽依赖"和"窄依赖"是用来描述RDD之间依赖关系的两个重要概念。这些概念主要涉及到在执行阶段(运行时)中,Spark如何在不同的分区之间进行数据的传递和处理。
Spark中对每个RDD执行一个算子操作时,都会重新从源头处计算一遍
如果该RDD被多次使用,则会导致该RDD被重复计算
重复计算,浪费资源,消耗时间,影响整体性能对多次使用的RDD可以通过cache/persist操作进行缓存
repeatRDD.cache()
默认以仅内存策略对RDD进行缓存
相当于repeatRDD.persist(StorageLevel.MEMORY_ONLY)
级别 | 使用空间 | CPU时间 | 是否在内存中 | 是否在磁盘上 | 备注 |
---|---|---|---|---|---|
MEMORY_ONLY | 高 | 低 | 是 | 否 | |
MEMORY_ONLY_2 | 高 | 低 | 是 | 否 | 数据存2份 |
MEMORY_ONLY_SER_2 | 低 | 高 | 是 | 否 | 数据序列化,数据存2份 |
MEMORY_AND_DISK | 高 | 中等 | 部分 | 部分 | 如果数据在内存中放不下,则溢写到磁盘 |
MEMORY_AND_DISK_2 | 高 | 中等 | 部分 | 部分 | 数据存2份 |
MEMORY_AND_DISK_SER | 低 | 高 | 部分 | 部分 | |
MEMORY_AND_DISK_SER_2 | 低 | 高 | 部分 | 部分 | 数据存2份 |
DISK_ONLY | 低 | 高 | 否 | 是 | |
DISK_ONLY_2 | 低 | 高 | 否 | 是 | 数据存2份 |
NONE | 不缓存 | ||||
OFF_HEAP | 堆外内存 |
Checkpoint 检查点是一种容错容灾机制
Cache | Checkpoint | |
---|---|---|
使用场景 | 重复的RDD进行缓存,提高性能 | 计算代价大或者数据链路过长的RDD,容错 |
存储位置 | 内存(易丢失) | 磁盘或HDFS(可靠的文件存储系统) |
依赖关系 | 需要保存RDD之间的血缘依赖关系 | 切断RDD之间的血缘依赖关系 |
原理 | 当每个Partition的数据被计算出来即可保存 | 等第一个job执行完之后会重新启动一个新任务进行处理 |
清理策略 | Job结束后自动删除 | 需要手动删除,下一个Driver程序可直接加载 |
使用广播变量的原因
算子内部的代码最终会被封装到Task并发送到Executor中执行
如果在算子内部使用了算子外部的变量,变量也会封装到Task中,Task中使用的实际上是外部变量的副本,Task的数量决定了外部变量副本的数量
Task是在Executor中执行的,且Task的数量会远大于Executor的数量
故可将外部变量广播到每个Executor中,减少变量的副本数
进而减少网络中传输的数据量,提升运行效率
广播变量介绍
广播变量(Broadcast Variables)是Spark中一种用于高效分发较大数据集给所有工作节点的机制。在分布式计算中,当需要在所有节点上使用相同的只读数据时,可以使用广播变量来减少数据传输开销,提高性能。
通常情况下,Spark会在集群的每个工作节点上复制一份任务的变量。但是,对于相对较大的变量,这样的传输开销可能是昂贵的。广播变量通过在集群上的各个节点上缓存变量的只读副本,从而避免了多次传输相同的数据。
应用场景
累加器作用
如果变量不被声明为累加器,那么它被改变时不会在Driver端进行全局汇总
即在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值
广播变量获取流程
广播变量获取后会优先放入内存中,由BlockManager管理维护
后续Task可直接从MemoryStore中获取使用
Yarn-client模式
在 YARN Client 模式下,spark-submit提交 Spark Job之后,就会提交的本地机器上启动Driver端
Driver 启动后会与 ResourceManager (RM)建立通讯并发起启动 ApplicationMaster(AM) 请求
RM接收到这个 Job 时,会在集群中选一个合适的 NodeManager (NM)并分配一个 Container(具有计算资源的一个容器),然后启动 ApplicationMaster(初始化SparkContext)
AM的功能相当于一个 ExecutorLaucher (Executor启动器),负责向 RM申请 Container 资源 ,RM收到请求后便会与 NM通信,启动 Container
AM对RM指定 NM分配的 Container 发出启动 Executor 进程请求
Executor进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行执行 Job 任务
Driver 中的 SparkContext 分配 Task 给 Executor 执行,Executor 运行 Task 并向 Driver 汇报运行的状态、进度、以及最终的计算结果;让 Driver 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
应用程序运行完成后,AM向 RM申请注销并关闭自己。
Yarn Cluster模式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。