这是我参与「第四届青训营 」笔记创作活动的第2天
本节课的内容包括:
- 大数据处理引擎Spark介绍
- SparkCore原理解析
- SparkSQL原理解析
- 业界挑战与实践
1. 大数据处理引擎Spark介绍
关键特征:
- 多语言选择统一的方式处理数据
- 进行快速的SQL分析
- 大规模的数据科学(EDA)
- 对机器学习算法扩展到集群上
1.1 Spark运行架构和部署方式
运行架构:
Cluster Manager: 集群管理器,控制集群,监控Worker节点,负责资源管理和调度
Worker Node: 从节点,yarn中称为Node Manager,负责控制计算节点,负责启动Executor和Task
Driver Program: 应用管理者,控制应用的执行
用户程序从提交到计算经历的过程: 用户创建SparkContext -> SparkContext连接Cluster Manager ->Cluster Manager 为任务分配计算资源并启动Executor -> Driver向Executor发送Task -> Executor下载Task配置和环境执行Task并将状态反馈给Driver -> Driver根据收到的状态进行状态更新直到Task执行完成或中断
部署方式:
Local Mode: 本地测试的单进程多线程模式
Standalone Mode: 带Master和Worker的模式
onYARN/K8S: 调度工作交给外部资源调度器
2.SparkCore原理解析
submit命令提交->AppMaster管理资源->(Yarn下的AppMaster相当于Driver)Driver管理和分配Task
2.1 RDD介绍(容错的、可并行执行的分布式数据集):
特性:
- 分区列表(分区决定了并行计算的数量,创建RDD的时候可以指定分区)
- Compute(RDD实现的函数给不同的Partition进行计算)
- Dependencies(RDD转换形成的前后依赖关系)
- Partitioner(基于HASH和位置的分区器)
- PreferredLocations(分区具有的优先位置列表,移动数据不如移动计算,更快的进行计算)
2.2 RDD算子
2.3 RDD依赖
比如map操作可以在一个节点完成,不需要多个节点的数据传输,对应窄依赖,而groupBy操作设计到数据的重分发shuffle,而宽依赖产生对应的shuffle操作。
如果发生节点故障,窄依赖比如map操作对应一个父RDD分区进行重算,而宽依赖可能所有的父RDD分区都要进行重算,可以设置检查点存储数据。
2.4 Spark内存和Shuffle机制
主要两种内存:
- Execution Memory(执行内存):Shuffle进行占用的内存
- Storage Memory(存储内存):缓存RDD数据或者广播数据
两种内存之间可以相互借用
上一个Stage计算会得到dataFile和indexFile,下一个Stage会根据indexFile找到对应的数据
3.SparkSQL原理解析
SQL + DF -> 抽象语法树 ->(Analysis)遍历节点进行数据类型绑定 -> 解析完成的逻辑计划 -> 第一节课讲的优化策略(RBO规则和CBO代价) -> 优化后的逻辑计划 -> 选择最佳物理执行计划 -> 实现
3.1 Catalyst优化器:
RBO:
CBO:
依赖数据库的对象信息统计
统计信息在估算过程中过时了,会产生负面效果,所以在spark3.0中新增了Adaptive Query Execution(AQE)
根据已经完成的计划的真实节点进行统计来进行优化
支持的优化场景:
- Partition合并:
图中将5个task变成了3个task提高了性能
- SMJ -> BHJ
小表的filter降低了数据量可以切换到BHJ进行处理
- Skew Join
将大的分区进行拆分, 从A0 Join B0 - > A00 Join B0 + A01 Join B0
针对Join的优化(3.1版本引进) Runtime Filter
比如图中的A和B的Join,通过获取A的相关信息对B进行过滤可以减少Join的数据量,提高性能
3.2 Codegen(通过提高CPU利用率让任务更快完成)
- 表达式的Codegen
2. WholeStageCodegen
4. 业界挑战
1.shuffle稳定性问题
2. SQL执行性能问题