这是我参与「第四届青训营 」笔记创作活动的第5天
Apache Spark
spark是一种用于大数据工作负载的分布式开源处理系统,spark的生态和特点:
- 统一引擎,支持多种分布式场景
- 多语言支持(SQL、Java、R、Python)
- 可读写丰富数据源
- 丰富灵活的API/算子
- 支持K8S/YARN/Mesos资源调度
Spark开源在github的地址:github.com/apache/spar…
可以根据Quick Start尝试体验:spark.apache.org/docs/latest…
SparkCore
RDD
RDD(Resilient Distributed Dataset),弹性分布式数据集,是Spark中最基本的数据抽象,包含了数据集的一些基本属性:
- 分区列表
- 计算函数
- 依赖关系
- 分区函数
- 最佳位置
RDD算子分为两类:
- Transform算子:返回一个新生成的RDD
- Action算子:返回值非RDD
父子RDD之间有两种依赖关系:
- 窄依赖:父RDD的每个partition至多对应一个子RDD分区,多个分区可以并行计算,如果一个分区数据丢失,只需要重新计算对应的分区即可
- 宽依赖:父RDD的每个partition可能对应多个子RDD分区,宽依赖是划分阶段的依据,必须等上一阶段计算完成才开始计算下一阶段
Spark SQL
RDD的运行流程中任务会按照代码运行,开发者对效率的影响很大,而Spark SQL并不是直接生成任务计划并执行,而是会先经过Catalyst优化器优化代码。
Catalyst优化器
- 首先经过解析SQL生成AST
- 把元数据信息添加到AST中
- 优化AST:
- 谓词下推:Filter下推,减小数据集
- 列值裁剪:裁剪无关的列,减少数据量
- 最后生成物理计划,生成RDD来运行
AQE(Adaptive Query Execution)
AQE是Spark SQL的动态优化机制,在Shuffle Map阶段完成之后,AQE会分析这个阶段的统计信息,识别匹配一些优化场景,对后续未执行的逻辑计划和物理计划进行优化。
AQE具有3个特征:
- 动态合并Shuffle partitions
- 动态切换Join策略:
- 动态优化数据倾斜