Speark|青训营笔记

85 阅读2分钟

这是我参与【第四届青训营-大数据场】笔记创作活动的第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的数据

c19661f12b298e826e09cb7d8a2cebc.png

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稳定性/性能有非常大影响
  • 同时,线上作业失败/运行慢,用户排查难度大
  • 自动参数推荐/作业诊断