这是我参与【第四届青训营-大数据场】笔记创作活动的第6天
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的数据
Adaptive Query Execution(AQE)
- 每个Task结束会发送MapStatus信息给Driver
- Task的MapStatus中包含当前Task Shuffle产生的每个Partition的size统计信息
- Driver获取到执行完的Stages的MapStatus信息之后,
- 按照MapStatus中partition大小信息识别匹配-些优化场景然后对后续未执行的Plan进行优化
- 目前支持的优化场景:
- -Partiiton合并,优化shuffle读取,减少reduce task个数 - SMJ -> BHJ -Skew Join优化
- spark.sql.shuffle.partition作业粒度参数,一个作业中所有
- Stage都一样,但是每个Stage实际处理的数据不一样,可能某些Stage的性能比较差比如:
- -partition参数对某个Stage过大,则可能单个partition的大小比较小,而且Task个数会比较多,shuffle fetch阶段产生大量的小块的随机读,影响性能
- -parition参数对某个Stage过小,则可能单个partition的大小比较大,会产生更多的spill或者OOM
AQE - Coalescing Shuffle Partitions
- Spark参数很多,资源类/Shuffle/Join/Agg/...调参难度大
- 参数不合理的作业,对资源利用率/Shuffle稳定性/性能有非常大影响
- 同时,线上作业失败/运行慢,用户排查难度大
- 自动参数推荐/作业诊断