这是我参与「第四届青训营 」笔记创作活动的第5天
Spark原理及实践
一、大数据处理引擎Spark介绍
1.1 大数据处理技术栈
1.2 常见大数据处理链路
1.3 什么是Spark
1.4 Spark生态&特点
- 统一引擎,支持多种分布式场景
- 多语言支持
- 可读写丰富数据源
- 丰富灵活的API/算子
- 支持K8S、YARN、Mesos资源调度
1.4.1 Spark特点-丰富数据源
内置DataSource
- Text
- Parquet/ORC
- JSON/CSV
- JDBC
自定义DataSource
- 实现DataSourceV1 V2 API
- HBase/Mongo/ElasticSearch
- A community index of third-party packages for Apache Spark
1.4.2 丰富的API/算子
1.5 SPark运行架构&部署方式
Spark Local Mode
本地测试/单进程多线程模式 spark-sql --master local[*]
Spark Standalone Mode
需要启动Spark的Standalone集群的Master/Worker
1.6 Spark下载编译
1.7 Spark性能benchmark
TPC-DS/TPC-H benchmark
二、SparkCore原理解析
2.1 SparkCore
2.2 RDD
Resilient Distributed Dataset
Represents an immutable, partitioned collection of elements that can be operated on in parallel
2.2.1 如何创建RDD?
2.2.2 RDD 算子
- Transform算子:生成一个新的RDD
- Action算子:触发Job提交
2.2.3 RDD依赖
RDD依赖:描述父子RDD之间的依赖关系(lineage)
- 窄依赖:父RDD的每个partition至多对应一个子RDD分区 NarrowDependency OneToOneDependency RangeDependency PruneDependency
- 宽依赖:父RDD的每个partition都可能对应多个子RDD分区 ShuffleDependency
2.2.4 RDD执行流程
2.3 调度器
2.4 内存管理
- Executor内存主要有两类:Storage Execution
- UnifiedMemoryManager统一管理Storage/Execution内存
- Storage和Execution内存使用是动态调整,可以相互借用
- 当Storage空闲,Execution可以借用Storage的内存使用
- 可以减少spill等操作,Execution使用的内存不能被Storage驱逐
- 当Execution空闲,Storage可以借用Execution的内存使用
- 当Execution需要内存时,可以驱逐被Storage借用的内存,知道spark.memory.storageFraction边界
2.4.1 多任务间内存分配
UnifiedMemoryManager统一管理多个并发Task的内存分配
每个Task获取的内存区间魏1/(2*N)~1/N N为当前Executor中正在并发运行的task数量
2.5 Shuffle
2.5.1 SortShuffleManager
2.5.2 External Shuffle Service
三、SparkSQL原理解析
3.1 Catalyst优化器
RBO
CBO
3.2 Adaptive Query Execution(AQE)
3.3 Runtime Filter
3.4 Bloom Runtime Filter
3.5 Codegen - Expression
WholeStageCodegen