Spark原理 | 青训营笔记

150 阅读3分钟

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

Spark生态及特点

image.png

Spark运行架构及部署方式

  • 每个Spark application都有其对应的多个executor进程,并且应用之间是隔离的。

    • 原理:Executor进程在整个应用程序生命周期内,都保持运行状态,并以多线程方式执行任务。
    • 缺点:多个Spark应用程序之间无法共享数据,除非把数据写到外部存储结构中
  • Spark比较容易的在多种集群管理器上运行,因为Spark对底层的集群管理器一无所知,只要Spark能够申请到executor进程,能与之通信即可。

  • driver program必须能够被所有worker节点访问到。

  • driver应该和worker节点距离近一些,最好在同一个本地局域网中。

SparkCore:RDD

RDD执行过程

内存管理:统一内存管理,动态占用机制

对上图的理解:

  • 主要部分是:执行内存存储内存两大块
  • 双向箭头表示可以互相借用对方的空间。
  • 但是,执行内存可以驱逐存储内存的空间(即当存储空间非空闲时强行借用),但存储内存不能在执行内存非空闲时强行借用。

我的理解:执行是老大,对老大来说,你的就是我的,我的就是我的。

  • 其他部分:
    • user memory:存储用户自定义的数据结构或者spark内部元数据
    • Reserverd memory:预留内存,防止OOM,

堆内(On-Heap)内存/堆外(Off-Heap)内存:Executor 内运行的并发任务共享 JVM 堆内内存。为了进一步优化内存的使用以及提高 Shuffle 时排序的效率,Spark 可以直接操作系统堆外内存,存储经过序列化的二进制数据。减少不必要的内存开销,以及频繁的 GC 扫描和回收,提升处理性能。

SparkSQL:

SparkSQL执行过程

前四步和第一节课讲SQL optimizer时大同小异,此处不再赘述。

第五步:CostModel: 根据过去的性能统计数据,选择最佳的物理执行计划。 第六步: sql逻辑生成Java字节码。

影响SparkSQL性能两大技术:Optimizer&&Runtime

Catalyst优化:RBO和CBO两种

AQE

根据已经完成的计划结点真实且精确的执行统计结果来不停的反馈并重新优化剩下的执行计划。

AQE框架三种优化场景:

  • 动态合并shuffle分区

  • 动态调整Join策略

  • 动态优化数据倾斜Join

RuntimeFilter

概念:在Catalyst中。动态获取Filter内容并做相关优化。 理解:将一张大表和一张小表等值连接时,我们可以从小表侧收集统计信息,并在执行join前将其用于大表的扫描,进行分区修剪或数据过滤。

类别:

  • 全局优化
  • 局部优化(主要是CPU方面)

Codegen

提高cpu的利用率