Spark 存储管理

Spark 批量计算任务一般从外部存储系统读取输入数据(如 HDFS 或 HBase),Spark 会优先选择在数据存储的机器上执行任务。

Spark 大部分计算在内存中进行,但是仍需要本地磁盘存储不能全部放入内存的数据,以及不同 Stage 之间的中间输出结果。

Storage 模块

Spark 的 Storage 模块分为两层:通信层和存储层

  • 通信层:Storage 模块采用 Master/Slave 结构实现,Master 和 Slave 之间通过通信层传输控制信息和状态信息。
  • 存储层:Storage 模块需要把数据存储到 Disk 或 Memory,由存储层实现和提供接口。

Storage 模块提供统一操作类:BlockManager,实现了所有与 Storage 模块的交互方法。

通信层

通信模块由 BlockManager、BlockManagerMasterActor、BlockManagerSlaveActor 等模块组成。

Master 持有 BlockManagerMasterActor 的 actor 和所有 BlockManagerSlaveActor 的ref,Slave 持有 BlockManagerMasterActor 的 ref 和自身 BlockManagerSlaveActor 的 actor。

actor 和 ref 是 Akka 中的概念(新的 Spark 已经实现了 Netty 通信代替 Akka 通信),actor 类似于网络服务中的 Server 端,保存所有状态信息,接收 Client 端的请求执行,并返回。ref 类似与网络服务中的 Client 端,向 Server 端发起请求获取结果。

Spark 会在 Driver 和 Executor 各自创建 BlockManager,通过 ref 和 actor 互相通信。

  1. Executor -> Driver,Executor 创建 BlockManager 后向 Driver 发送请求注册自己、发送心跳(更新 Block 信息)等
  2. Driver -> Executor,Driver 存储 Block 所在的 BlockManager,向对应 Executor 发送命令等

存储层

RDD 作为 Spark 的数据抽象模型,由不同的分区(partition)组成,转换操作都是在分区上进行的。在 Storage 内部,RDD 被视为由不同的 Block 组成,本质上 partition 和 block 是一样的。

Storage 存取数据的基本单位是 Block,BlockManager 在创建的同时会创建 MemoryStore 和 DiskStore 对象用以存取 Block,BlockManagerWorker 用以监听远程的 Block 请求,进行处理。

Shuffle 数据持久化

Shuffle 在 MapReduce 的概念中是 Map 和 Reduce 的中间过程,Map 的数据被 Reduce 使用,需要按照 key 进行重新分区存储,Reduce 方法拉取响应的数据目录进行处理。Shuffle 过程涉及磁盘的读写和网络传输,因此 Shuffle 的效率直接影响整个程序的运行效率。

Spark 在分布式环境中运行,不可能在单进程内存中计算,所以也需要 Shuffle 的过程。Spark Shuffle 分为 shuffle writeshuffle fetch 两个阶段,在 Stage 之间进行操作。

先简单了解下 Shuffle 过程:

Spark

示例任务分为 Stage0~3 四个阶段,从 Stage2、Stage3 开始执行,每个 Stage 最后阶段进行 shuffle write,数据根据下一个 Stage 的分区需求重新分区并写入磁盘。执行完 Stage2、Stage3 后,Stage1 去存储数据的节点获取需要的数据,拉取到本地后进行转换操作,这个过程就是 shuffle fetch(shuffle read)。


Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

2 × 4 =