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

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

一、大数据处理引擎Spark介绍

Spark生态和特点

  • 统一引擎,支持多种分布式场景
  • 多语言支持
  • 可读写丰富数据源
  • 丰富灵活的API算子
    • SparkCore→RDD
    • SparkSQL→DataFrame
  • 支持K8S/YARN/Mesos资源调度

二、Spark原理解析

如何创建RDD

  • 内置RDD\

ShuffleRDD/HadoopRDD/JDBCRDD/KafkaRDD/ UnionRDD/MapPartitionsRDD/..

  • 自定义RDD

class CustomRD...) extends RDD {}
实现五要素对应的函数

两类RDD算子

Transform算子:生成一个新的RDD

map/filter/flatMap/groupByKey/reduceByKey/...

Action算子:触发Job提交

collect/count/take/saveAsTextFile/.

RDD依赖

描述父子RDD之间的依赖关系
➢窄依赖:父RDD的每个partition至多对应一个子RDD分区。
➢宽依赖:父RDD的每个partition都可能对应多个子RDD分区。

Scheduler

根据ShuffleDependency切分Stage,并按照依赖顺序调度Stage,为每个Stage生成并提交TaskSet到TaskScheduler
根据调度算法(FIFO/FAIR)对多个TaskSet进行调度,对于调度到的TaskSet,会将Task调度(locality)到相关Executor上面执行,Executor SchedulerBackend提供

Memory Management

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

Shuffle

每个MapTask生成一个Shuffle数据文件和一 个index文件dataFile中的数据按照partitionld进行排序,同一个partitionld的数据聚集在一起indexFile保存了所有paritionld在dataFlle中的位置信息,方便后续ReduceTask能Fetch到对应partitionld的数据。
shuffle write的文件被NodeManage r中的Shuffle Service托管,供后续Reduce Task进行shuffle fetch,如果Executor空闲,DRA可以进行回收

SparkSQL原理解析

Catalyst优化器- RBO

  • transformDown先序遍历树进行规则匹配
  • transformUp后序遍历树进行规则匹配

Adaptive Query Execution(AQE)

每个Task结束会发送MapStatus信息给Driver
Task的MapStatus中包含当前Task Shuffle产生的每个Partition的size统计信息 Driver获取到执行完的Stages的MapStatus信息之后,按照MapStatus中partition大小信息识别匹配些优化场景,然后对后续未执行的Plan进行优化
目前支持的优化场景

  • Partiton合并,优化shuffle读取, 减少reduce task个数
  • SMJ -> BHJ
  • Skew Join优化