Storage模塊負責了Spark計算過程中所有的存儲,包括基於Disk的和基於Memory的。用戶在實際編程中,面對的是RDD,可以將RDD的數據通過調用org.apache.spark.rdd.RDD#cache將數據持久化;持久化的動作都是由Storage模塊完成的。包括Shuffle過程中的數據,也都是由Storage模塊管理的。可以說,RDD實現了用戶的邏輯,而Storage則管理了用戶的數據。本章將講解Storage模塊的實現。

1.1 模塊整體架構

org.apache.spark.storage.BlockManager是Storage模塊與其他模塊交互最主要的類,它提供了讀和寫Block的介面。 這裡的Block,實際上就對應了RDD中提到的partition,每一個partition都會對應一個Block。每個Block由唯一的Block ID(org.apache.spark.storage.RDDBlockId) 標識,格式是"rdd_" + rddId + "_" + partitionId。

BlockManager會運行在Driver和每個Executor上。而運行在Driver上的BlockManger負責整個Job的Block的管理工作;運行在Executor上的BlockManger負責管理該Executor上的Block,並且向Driver的BlockManager彙報Block的信息和接收來自它的命令。

各個主要類的功能說明:

1) org.apache.spark.storage.BlockManager: 提供了Storage模塊與其他模塊的交互介面,管理Storage模塊。

2) org.apache.spark.storage.BlockManagerMaster: Block管理的介面類,主要通過調用org.apache.spark.storage.BlockManagerMasterActor來完成。

3) org.apache.spark.storage.BlockManagerMasterActor: 在Driver節點上的Actor,負責track所有Slave節點的Block的信息

4) org.apache.spark.storage.BlockManagerSlaveActor:運行在所有的節點上,接收來自org.apache.spark.storage.BlockManagerMasterActor的命令,比如刪除某個RDD的數據,刪除某個Block,刪除某個Shuffle數據,返回某些Block的狀態等。

5) org.apache.spark.storage.BlockManagerSource:負責搜集Storage模塊的Metric信息,包括最大的內存數,剩餘的內存數,使用的內存數和使用的Disk大小。這些是通過調用org.apache.spark.storage.BlockManagerMaster的getStorageStatus介面實現的。

6) org.apache.spark.storage.BlockObjectWriter:一個抽象類,可以將任何的JVM object寫入外部存儲系統。注意,它不支持並發的寫操作。

7) org.apache.spark.storage.DiskBlockObjectWriter:支持直接寫入一個文件到Disk,並且還支持文件的append。實際上它是org.apache.spark.storage.BlockObjectWriter的一個實現。現在下面的類在需要Spill數據到Disk時,就是通過它來完成的:

a) org.apache.spark.util.collection.ExternalSorter

b) org.apache.spark.shuffle.FileShuffleBlockManager

8) org.apache.spark.storage.DiskBlockManager:管理和維護了邏輯上的Block和存儲在Disk上的物理的Block的映射。一般來說,一個邏輯的Block會根據它的BlockId生成的名字映射到一個物理上的文件。這些物理文件會被hash到由spark.local.dir(或者通過SPARK_LOCAL_DIRS來設置)上的不同目錄中。

9) org.apache.spark.storage.BlockStore:存儲Block的抽象類。現在它的實現有:

a) org.apache.spark.storage.DiskStore

b) org.apache.spark.storage.MemoryStore

c) org.apache.spark.storage.TachyonStore

10) org.apache.spark.storage.DiskStore:實現了存儲Block到Disk上。其中寫Disk是通過org.apache.spark.storage.DiskBlockObjectWriter實現的。

11) org.apache.spark.storage.MemoryStore:實現了存儲Block到內存中。

12) org.apache.spark.storage.TachyonStore:實現了存儲Block到Tachyon上。

13) org.apache.spark.storage.TachyonBlockManager:管理和維護邏輯上的Block和Tachyon文件系統上的文件之間的映射。這點和org.apache.spark.storage.DiskBlockManager功能類似。

14) org.apache.spark.storage.ShuffleBlockFetcherIterator:實現了取Shuffle的Blocks的邏輯,包括讀取本地的和發起網路請求讀取其他節點上的。具體實現可以參照《Shuffle模塊詳解》。

來自anzhsoft

本文由anzhsoft 發佈於Spark技術內幕:Storage 模塊整體架構


推薦閱讀:
相关文章