这是我参与「第四届青训营 」笔记创作活动的第5天
一、本堂课重点内容:
课程主要分为四个部分
第一部分概述了Spark的背景和应用场景
第二部分介绍了Spark Core原理
第三部分介绍了Spark Sql原理
第四部分介绍了业界挑战和实践
二、知识点介绍:
- Spark运行架构和工作原理
-
Spark Core:Spark核心组件,它实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。
-
Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可以直接查询Hive、HBase等多种外部数据源中的数据。
-
Spark Structured Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理。
-
MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能。
-
Spark支持的集群管理器:
Standalone :Spark 附带的简单集群管理器,可以轻松设置集群。
Apache Mesos:通用集群管理器,也可以运行 Hadoop MapReduce 和服务应用程序。(已弃用)
Hadoop YARN: Hadoop 2 和 3 中的资源管理器。
Kubernetes:用于自动部署、扩展和管理容器化应用程序的开源系统。 -
内存管理
Spark 作为一个基于内存的分布式计算引擎,Spark采用统一内存管理机制。重点在于动态占用机制。设定基本的存储内存(Storage)和执行内存(Execution)区域,该设定确定了双方各自拥有的空间的范围,UnifiedMemoryManager统一管理Storage/Execution内存
双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间
当Storage空闲,Execution可以借用Storage的内存使用,可以减少spill等操作, Execution内存不能被Storage驱逐。Execution内存的空间被Storage内存占用后,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间 当Execution空闲,Storage可以借用Execution内存使用,当Execution需要内存时,可以驱逐被Storage借用的内存,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
-
AQE
AQE对于整体的Spark SQL的执行过程做了相应的调整和优化,它最大的亮点是可以根据已经完成的计划结点真实且精确的执行统计结果来不停的反馈并重新优化剩下的执行计划。 -
AQE框架三种优化场景:
动态合并shuffle分区(Dynamically coalescing shuffle partitions)
动态调整Join策略(Dynamically switching join strategies)
动态优化数据倾斜Join(Dynamically optimizing skew joins)
三、课后拓展:
-
谓词下推
基本策略是,始终将过滤表达式尽可能移至靠近数据源的位置。 所谓谓词(predicate),英文定义是这样的:A predicate is a function that returns bool (or something that can be implicitly converted to bool),也就是返回值是true或者false的函数
不影响结果的情况下,尽量将过滤条件提前执行
谓词下推后,过滤条件在map端执行,减少了map端的输出,降低了数据在集群上传输的量,节约了集群的资源,也提升了任务的性能。
-
RDD(Resilient Distributed Dataset)
弹性分布式数据集弹性: 存储的弹性:内存与磁盘的自动切换; 容错的弹性:数据丢失可以自动恢复; 计算的弹性:计算出错重试机制; 分片的弹性:可根据需要重新分片。
分布式:数据存储在大数据集群不同节点上
数据集:RDD封装了计算逻辑,并不保存数据
数据抽象:RDD是一个抽象类,需要子类具体实现
不可变:RDD封装了计算逻辑,是不可以改变的,想要改变,只能产生新的RDD,在新的RDD里面封装计算逻辑可分区、并行计算
-
累加器
累加器用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行merge。 -
广播变量
广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,广播变量用起来都很顺手。在多个并行操作中使用同一个变量,但是 Spark会为每个任务分别发送。
四、引用参考:
- 谓词下推在Hive和Spark中的优化实践
- Spark核心编程的三大数据结构