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

95 阅读3分钟

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

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

    1. 生态&特点

      统一引擎,支持多种分布式场景

      多语言支持

      可读写丰富数据源

      丰富灵活的API/算子

      支持K8S/YARN/Mesos资源调度

  2. SparkCore 原理解析

    Snipaste_2022-07-31_16-18-04.png

    1. RDD

      RDD(Resilient Distributed Dataset):Represents an immutable,partitioned collection of elements that can be operated on in parallel.

      1. 如何创建RDD

        1. 内置RDD

        2. 自定义RDD

          class CustomRDD(...) extends RDD{}

          实现五要素对应的函数

      2. RDD算子

        1. Transform 算子:生成一个新的RDD
        2. Action算子:触发Job提交
      3. RDD依赖

        1. 定义:描述父子RDD之间的依赖关系(lineage)
        2. 窄依赖:父RDD的每个partition至多对应一个子RDD分区
        3. 宽依赖(会产生shuffle):父RDD的每个partiton都可能对应多个子RDD分区
      4. RDD 执行流程

        1. Job:RDD action算子触发
        2. Stage:依据宽依赖划分
        3. Task:Stage内执行单个partition任务
    2. Scheduler

      1. 根据Shuffle Dependency切分Stage,并按照依赖顺序调度Stage,为每个Stage生成并提交Task Set到Task Scheduler
      2. 根据调度算法(FIFO/FAIR)对多个Task Set进行调度对于调度到的Task Set,会将Task调度(locality)到相关Executor.上面执行,Executor Scheduler Backend提供
    3. Memory Management

    --Executor内存主要有两类:Storage、Execution --Unified Memory Manager统一管理Storage/Execution内存 --Storage和Execution内存使用是动态调整,可以相互借用 --当Storage空闲,Execution可以借用Storage的内存使用,可以减少spi等操作,Execution使用的内存不能被Storage驱逐 --当Execution空闲,Storage可以借用Execution的内存使用,当Execution需要内存时,可以驱逐被Storage借用的内存,直到spark.memory.storage Fraction边界

    --UnifiedMemoryManager 统一管理多个并发Task的内存分配,每个Task获取的内存区间为1/(2*N)~1/N,N为当前Executor中正在并发运行的task数量

    1. Shuffle

      每个Map Task生成一个Shuffle数据文件和一个index,文件data File中的数据按照partitionld进行排序同一个partitionld的数据聚集在一起index File保存了所有paritionld在data Flle中的位置信息,方便后续Reduce Task能Fetch到对应partitionld的数据

      shuffle write的文件被NodeManage中的Shuffle Service托管,供后续ReduceTask 进行shuffle fetch,如果Executor空闲,DRA可以进行回收

  3. SparkSQL原理解析

    Snipaste_2022-07-31_16-44-50.png 2. Catalyst 优化器 - RBO

    1. batch执行策略

      Once -> 只执行一次

      FixedPoint -> 重复执行,知道plan不再改变,或者执行达到固定次数(默认100次)

    2. Adaptive Query Execution

      每个Task结束会发送Map Status信息给Driver

      Task的Map Status中包含当前Task Shuffle产生的 每个Partition的size统计信息

      Driver获取到执行完的Stages的Map Status信息之后, 按照Map Status中partition大小信息识别匹配一些优化场景, 然后对后续未执行的PIan进行优化

      目前支持的优化场景: -Partiiton合并,优化shufflei读取,减少reduce task个数 -SMJ->BHJ -Skew Join优化

本课程内容较多,只整理了我认为比较重要的几点,其他的需要读者继续学习记忆。