这是我参与「第四届青训营 」笔记创作活动的的第3天。
一、Spark简介
1. Spark版本亮点
Spark3.0
- AQE: Adaptive Query Execution
- DPP: Dynamic Partition Pruning
- Accelerator-aware Scheduling
Spark3.3
- Bloom Filter Joins
- Query Execution Enhancements
- etc..
2. Spark生态特点
- 统一引擎
- 多语言支持
- 可读写丰富数据源 Text, Parquet/ORC,JSON/CSV,JDBC
- 灵活API/算子 SparkCore -> RDD, SparkSQL -> DataFrame
- 支持K8S/YARN/Mesos资源调度
二、Spark Core原理
1. 什么是RDD
- Partitions
- Dependencies
- Partitioner
- PreferredLocations
2. 创建RDD
- 内置RDD
- 自定义RDD
3. RDD算子
- Transform
- 生成一个新的RDD
- Action
- 触发Job的提交
4. RDD依赖
- 描述父子RDD之间的依赖关系
- 宽依赖
- 父RDD每个partition都可能对应多个RDD分区
- NarrowDependency
- OneToOneDependency
- RangeDependency
- PruneDependency
- 父RDD每个partition都可能对应多个RDD分区
- 窄依赖
- 父RDD每个partition之多对应一个RDD分区
- ShuffleDependency
- 父RDD每个partition之多对应一个RDD分区
- 宽依赖
5. RDD执行流程
- Job: RDD action算子触发
- Stage: 根据宽依赖划分
- Task: Stage内执行单个Partition任务
三、Scheduler
1. DAGScheduler
2. TaskScheduler
四、Memory Management
1.Excutor内存——统一内存管理
- Storage Memory
- Execution Memory UnifiedMemoryManager统一管理并发Task的内存分配:每个Task获取内存区间为1/(Nx2) ~ 1/N N: 当前executor并发运行task的数量
五、 Shuffle
- SortShuffleManager
- External Shuffle Service
- Dynamic Resource Allocation
六、SparkSQL 原理解析
1. 流程
SQL Query + DataFrame -> Unresolved Logical Plan + catalog -> Logical Plan -> Optimized Logical Plan -> Physical Plans -> Cost Model -> Selected Physical Plan -> RDDs
2. Catalyst优化器
- RBO(Rule Based Optimizer)
- Batch执行策略
- Once只执行一次
- FixedPoint 重复执行直到plan不再改变
- Batch执行策略
- CBO(Cost Based Optimizer)
3. AQE
支持的场景
- Partition合并,优化Shuffle读取,减少reduce task的个数
- SortMergeJoin -> BroadcastHashJoin
- Skew Join优化 对应的技术
- Coalescing Shuffle Partitions
- Switching Join Strategies
- Optimizing Skew Joins
4. Filter
Runtime Filter 减少了大表的扫描 Bloom Runtime Filter
5. Codegen
- Expression
- WholeStageCodegen
七、Spark面临的挑战
1. Shuffle稳定性的问题
ExternalShuffleService容易IOPS瓶颈 解决方案:RemoteShuffleService, FireStorm等
2. SQL执行性能问题
- 问题
- 压榨CPU资源
- 解决方向
- C++实现向量化执行引擎
- OAP/gazelle_plugin
3. 参数推荐/作业诊断问题
- Spark参数过多,调参难度大
- 线上作业失败/运行慢,排查难度大
- 解决:自动参数推荐、作业诊断