这是我参与「第四届青训营」笔记创作活动的第5天。
课程目录
1.大数据处理引擎Spark介绍
2.SparkCore原理解析
3.SparkSQL原理解析
4.业界挑战与实践
1.大数据处理引擎Spark介绍
1.1 大数据处理技术栈
- 应用
- 计算
- 存储
- 数据
1.2 常见大数据处理链路
1.3 开源大数据处理引擎
- Batch
- Streaming
- OLAP
1.4 SPark
1.4.1 什么是Spark
用于大规模数据处理的统一分析引擎,是一种多语言引擎,可用于单机节点或者集群上来执行数据工程、数据科学和机器学习。
features
- 运用多语言选择用统一的方式处理流批数据
- 可以用仪表盘等执行快速分布式SQL察觉分析
- 适用于大规模数据科学,对PV级别的数据进行探索性数据分析
- 可以在单机上训练机器学习算法,方便拓展到大规模集群上
1.4.2 Spark版本演进
- 1.0版本:内存计算、丰富API/多语言支持、一站式解决方案、多部署模式
- 2.0版本
- 3.0版本
- 3.3版本
1.4.3 Spark生态&特点
- 统一引擎,支持多种分布式场景
- 多语言支持
- 可读写丰富数据源
- 丰富灵活的API/算子
- 支持K8S/YARN/Mesos资源调度
1.5 Spark特点
1.5.1 多语言支持
- SQL
- Java/Scala
- R
- Python
1.5.2 丰富数据源
- 内置DataSource
- 自定义DataSource
1.5.3 丰富的API/算子
- SparkCore->RDD
- SparkSQL->DataFrame
1.6 运行架构&部署方式
- 具体流程个人理解:用户创建SparkContext,连接到Cluster Manager,Cluster Manager根据用户提交时设置的参数(CPU/内存)分配计算资源,从而启动Executor,Driver Program将用户程序划分不同task来进行构成,task分区待处理数据,在阶段划分完成以及task创建完成后,Driver Program向Executor发送task,Executor接收到task后下载task执行环境开始执行task,实时将task运行状态汇报给Driver Program,Driver Program根据运行状态做状态更新,不断调度执行task,直到所有task执行正确或超过执行次数限制。
- Spark Local Mode 本地测试/单进程多线程模式
- Spark Standalone Mode 需要启动Spark的Standalone集群的Master/Worker
- on YARN/K8S 依赖外部资源调度器
1.7 Spark下载编译
- 编译
- 下载
1.8 Spark包概览
1.9 Spark提交命令
- 环境变量
- spark-shell
- spark-sql
- pyspark
1.10 提交一个简单任务
- SparkIi scala代码
- 编译成jar包之后,使用spark-submit提交
1.11 Spark UI
- Job运行中->http://port
- Job运行完->SparkHistoryServer可查看
1.12 Spark性能 benchmark
2.SparkCore原理解析
2.1 SparkCore
2.2 什么是RDD
描述RDD的五要素
2.2.1 如何创建RDD
- 内置RDD
- 自定义RDD
2.2.2 RDD算子
两类RDD算子
- Transform算子:生成一个新的RDD
- Action算子:触发Job提交
2.2.3 RDD依赖
描述父子RDD之间的依赖关系(lineage)
窄依赖:父RDD的每个partition至少对应一个子RDD分区
- NarrowDependency
- OneToOneDependency
- RangeDependency
- PruneDependency
宽依赖:父RDD的每个partition都可能对应多个子RDD分区
ShuffleDependency
2.2.4 RDD执行流程
- Job:RDD action算子触发
- Stage:依据宽依赖执行
- Task:Stage内执行单个partition任务
2.3 Scheduler
2.4 Memory Management
Executor内存主要有两类
- Storage
- Execution
- UnifiedMemoryManager统一管理多个并发Task的内存分配
- 每个Task获取的内存区间为1/(2*N)~1/N【N为当前Executor中正在并发运行的task数量】
2.5 Shuffle
3.SparkSQL原理解析
3.1 Catalyst优化器
Rule Based Optimizer(RBO)
- transformDown 先序遍历树进行规则匹配
- transformUp 后序遍历树进行规则匹配
Cost Based Optimizer(CBO)
3.2 Adaptive Query Execution(AQE)
目前支持的优化场景:
- Partition合并,优化shuffle读取,减少reduce task个数
- SMJ->BHJ
- Skew Join优化
3.2.1 Coalescing Shuffle Partitions
Partition合并
3.2.2 Switching Join Strategies
SortMergeJoin(SMJ)->BroadcastHashJoin(BHJ)
3.2.3 Optimizing Skew Joins
Skew Join
- AQE根据MapSatus信息自动检测是否有倾斜
- 将大的partition拆分成多个Task进行Join
3.3 Runtime Filter
3.4 Bloom Runtime Filter
- tpcds/q16.sql:
- AND cs1.cs_call_center_sk=cc_call_center_sk
3.5 Codegen-Expression
表达式(Expression)
算子/Whole StageCodegen
4.业界挑战与实践
4.1 Shuffle稳定性问题
Shuffle 稳定性解决方案
4.2 SQL执行性能问题
压榨CPU资源
- Photon:C++实现的向量化执行引擎
- Intel:OAP/gazelle_plugin