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

122 阅读2分钟

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

一、Spark简介

1. Spark版本亮点

Spark3.0

  • AQE: Adaptive Query Execution
  • DPP: Dynamic Partition Pruning
  • Accelerator-aware Scheduling

Spark3.3

  • Bloom Filter Joins
  • Query Execution Enhancements
  • etc..

2. Spark生态特点

  • 统一引擎
  • 多语言支持
  • 可读写丰富数据源 Text, Parquet/ORC,JSON/CSV,JDBC
  • 灵活API/算子 SparkCore -> RDD, SparkSQL -> DataFrame
  • 支持K8S/YARN/Mesos资源调度

二、Spark Core原理

1. 什么是RDD

  • Partitions
  • Dependencies
  • Partitioner
  • PreferredLocations

2. 创建RDD

  • 内置RDD
  • 自定义RDD

3. RDD算子

  • Transform
    • 生成一个新的RDD
  • Action
    • 触发Job的提交

4. RDD依赖

  • 描述父子RDD之间的依赖关系
    • 宽依赖
      • 父RDD每个partition都可能对应多个RDD分区
        • NarrowDependency
        • OneToOneDependency
        • RangeDependency
        • PruneDependency
    • 窄依赖
      • 父RDD每个partition之多对应一个RDD分区
        • ShuffleDependency

5. RDD执行流程

  • Job: RDD action算子触发
  • Stage: 根据宽依赖划分
  • Task: Stage内执行单个Partition任务

三、Scheduler

1. DAGScheduler

2. TaskScheduler

四、Memory Management

1.Excutor内存——统一内存管理

  • Storage Memory
  • Execution Memory UnifiedMemoryManager统一管理并发Task的内存分配:每个Task获取内存区间为1/(Nx2) ~ 1/N N: 当前executor并发运行task的数量

五、 Shuffle

  • SortShuffleManager
    • External Shuffle Service
    • Dynamic Resource Allocation

六、SparkSQL 原理解析

1. 流程

SQL Query + DataFrame -> Unresolved Logical Plan + catalog -> Logical Plan -> Optimized Logical Plan -> Physical Plans -> Cost Model -> Selected Physical Plan -> RDDs

2. Catalyst优化器

  • RBO(Rule Based Optimizer)
    • Batch执行策略
      • Once只执行一次
      • FixedPoint 重复执行直到plan不再改变
  • CBO(Cost Based Optimizer)

3. AQE

支持的场景

  • Partition合并,优化Shuffle读取,减少reduce task的个数
  • SortMergeJoin -> BroadcastHashJoin
  • Skew Join优化 对应的技术
  • Coalescing Shuffle Partitions
  • Switching Join Strategies
  • Optimizing Skew Joins

4. Filter

Runtime Filter 减少了大表的扫描 Bloom Runtime Filter

5. Codegen

  • Expression
  • WholeStageCodegen

七、Spark面临的挑战

1. Shuffle稳定性的问题

ExternalShuffleService容易IOPS瓶颈 解决方案:RemoteShuffleService, FireStorm等

2. SQL执行性能问题

  • 问题
    • 压榨CPU资源
  • 解决方向
    • C++实现向量化执行引擎
    • OAP/gazelle_plugin

3. 参数推荐/作业诊断问题

  • Spark参数过多,调参难度大
  • 线上作业失败/运行慢,排查难度大
  • 解决:自动参数推荐、作业诊断