Spark原理与实践 | 青训营笔记

103 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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优化器

  1. 首先经过解析SQL生成AST
  2. 把元数据信息添加到AST中
  3. 优化AST:
    • 谓词下推:Filter下推,减小数据集
    • 列值裁剪:裁剪无关的列,减少数据量
  4. 最后生成物理计划,生成RDD来运行

AQE(Adaptive Query Execution)

AQE是Spark SQL的动态优化机制,在Shuffle Map阶段完成之后,AQE会分析这个阶段的统计信息,识别匹配一些优化场景,对后续未执行的逻辑计划和物理计划进行优化。

AQE具有3个特征:

  • 动态合并Shuffle partitions
  • 动态切换Join策略:
  • 动态优化数据倾斜