这是我参与「第四届青训营 」笔记创作活动的的第6天
-
大数据处理引擎Spark介绍
-
生态&特点
统一引擎,支持多种分布式场景
多语言支持
可读写丰富数据源
丰富灵活的API/算子
支持K8S/YARN/Mesos资源调度
-
-
SparkCore 原理解析
-
RDD
RDD(Resilient Distributed Dataset):Represents an immutable,partitioned collection of elements that can be operated on in parallel.
-
如何创建RDD
-
内置RDD
-
自定义RDD
class CustomRDD(...) extends RDD{}
实现五要素对应的函数
-
-
RDD算子
- Transform 算子:生成一个新的RDD
- Action算子:触发Job提交
-
RDD依赖
- 定义:描述父子RDD之间的依赖关系(lineage)
- 窄依赖:父RDD的每个partition至多对应一个子RDD分区
- 宽依赖(会产生shuffle):父RDD的每个partiton都可能对应多个子RDD分区
-
RDD 执行流程
- Job:RDD action算子触发
- Stage:依据宽依赖划分
- Task:Stage内执行单个partition任务
-
-
Scheduler
- 根据Shuffle Dependency切分Stage,并按照依赖顺序调度Stage,为每个Stage生成并提交Task Set到Task Scheduler
- 根据调度算法(FIFO/FAIR)对多个Task Set进行调度对于调度到的Task Set,会将Task调度(locality)到相关Executor.上面执行,Executor Scheduler Backend提供
-
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数量
-
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可以进行回收
-
-
SparkSQL原理解析
2. Catalyst 优化器 - RBO
-
batch执行策略
Once -> 只执行一次
FixedPoint -> 重复执行,知道plan不再改变,或者执行达到固定次数(默认100次)
-
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优化
-
本课程内容较多,只整理了我认为比较重要的几点,其他的需要读者继续学习记忆。