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

60 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

本节课的内容包括:

  1. 大数据处理引擎Spark介绍
  2. SparkCore原理解析
  3. SparkSQL原理解析
  4. 业界挑战与实践

1. 大数据处理引擎Spark介绍

image.png 关键特征:

  1. 多语言选择统一的方式处理数据
  2. 进行快速的SQL分析
  3. 大规模的数据科学(EDA)
  4. 对机器学习算法扩展到集群上

1.1 Spark运行架构和部署方式
image.png 运行架构:
Cluster Manager: 集群管理器,控制集群,监控Worker节点,负责资源管理和调度
Worker Node: 从节点,yarn中称为Node Manager,负责控制计算节点,负责启动Executor和Task
Driver Program: 应用管理者,控制应用的执行
用户程序从提交到计算经历的过程: 用户创建SparkContext -> SparkContext连接Cluster Manager ->Cluster Manager 为任务分配计算资源并启动Executor -> Driver向Executor发送Task -> Executor下载Task配置和环境执行Task并将状态反馈给Driver -> Driver根据收到的状态进行状态更新直到Task执行完成或中断
部署方式:
Local Mode: 本地测试的单进程多线程模式
Standalone Mode: 带Master和Worker的模式
onYARN/K8S: 调度工作交给外部资源调度器


2.SparkCore原理解析

image.png submit命令提交->AppMaster管理资源->(Yarn下的AppMaster相当于Driver)Driver管理和分配Task


2.1 RDD介绍(容错的、可并行执行的分布式数据集):
image.png 特性:

  1. 分区列表(分区决定了并行计算的数量,创建RDD的时候可以指定分区)
  2. Compute(RDD实现的函数给不同的Partition进行计算)
  3. Dependencies(RDD转换形成的前后依赖关系)
  4. Partitioner(基于HASH和位置的分区器)
  5. PreferredLocations(分区具有的优先位置列表,移动数据不如移动计算,更快的进行计算)

2.2 RDD算子
image.png

2.3 RDD依赖
image.png
比如map操作可以在一个节点完成,不需要多个节点的数据传输,对应窄依赖,而groupBy操作设计到数据的重分发shuffle,而宽依赖产生对应的shuffle操作。 如果发生节点故障,窄依赖比如map操作对应一个父RDD分区进行重算,而宽依赖可能所有的父RDD分区都要进行重算,可以设置检查点存储数据。 image.png image.png

2.4 Spark内存和Shuffle机制 image.png 主要两种内存:

  1. Execution Memory(执行内存):Shuffle进行占用的内存
  2. Storage Memory(存储内存):缓存RDD数据或者广播数据

两种内存之间可以相互借用

image.png
image.png 上一个Stage计算会得到dataFile和indexFile,下一个Stage会根据indexFile找到对应的数据

3.SparkSQL原理解析

image.png SQL + DF -> 抽象语法树 ->(Analysis)遍历节点进行数据类型绑定 -> 解析完成的逻辑计划 -> 第一节课讲的优化策略(RBO规则和CBO代价) -> 优化后的逻辑计划 -> 选择最佳物理执行计划 -> 实现
3.1 Catalyst优化器:
RBO: image.png image.png CBO:
image.png
依赖数据库的对象信息统计
统计信息在估算过程中过时了,会产生负面效果,所以在spark3.0中新增了Adaptive Query Execution(AQE) image.png 根据已经完成的计划的真实节点进行统计来进行优化
支持的优化场景:

  1. Partition合并:
    image.png 图中将5个task变成了3个task提高了性能
  2. SMJ -> BHJ image.png 小表的filter降低了数据量可以切换到BHJ进行处理
  3. Skew Join
    image.png
    将大的分区进行拆分, 从A0 Join B0 - > A00 Join B0 + A01 Join B0

针对Join的优化(3.1版本引进) Runtime Filter

image.png 比如图中的A和B的Join,通过获取A的相关信息对B进行过滤可以减少Join的数据量,提高性能

3.2 Codegen(通过提高CPU利用率让任务更快完成)

  1. 表达式的Codegen image.png 2. WholeStageCodegen
    image.png

4. 业界挑战

1.shuffle稳定性问题
image.png 2. SQL执行性能问题
image.png