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