Storage負責管理Spark計算過程中產生的數據,包括Disk和Memory,其中持久化的動作都是由Storage模塊完成的
Storage模塊采用Master/Slave架構,Master負責整個App的Block元數據信息的管理和維護,Slave將Block更新狀態上傳到Master,並接收Master的命令,它們之間通過AKKA機制通信
SparkContext創建時會在Driver端的SparkEnv創建BlockManager,持有一個BlockManagerMaster,並把請求轉發給BlockManagerMasterActor完成元數據管理和維護
Executor端存在一個BlockManager,也會持有一個BlockManagerMaster,不過會有對應於Driver端的一個reference,所以就能通過它來上報消息給Master
還會持有一個BlockManagerSlaveActor,Master持有SlaveActor的reference,進而下達命令。

存儲級別:
RDD持久化和緩存是Spark構建迭代式算法和快速交互式查詢的關鍵
調用persist()或者cache()標記RDD需要持久化,cache()是使用默認存儲級別(memory_only)的快捷方法
RDD的partition和Storage模塊的Block是一一對應關系!!
通過org.apache.spark.storage.StorageLevel定義存儲級別,選擇級別時考慮內存的使用量、避免落入硬盤、故障恢復能力(多副本機制)等
性能調優:
spark.local.dir
用於寫中間數據(RDD Cache、Shuffle)
可以配置:
1 多個路徑到多個磁盤增加整體IO帶寬
2 如果存儲設備的讀寫速度不同,可以在較快的存儲設備上配置更多的目錄增加被使用的比例
3 SPARK_LOCAL_DIRS(Standalone, Mesos) LOCAL_DIRS(YARN)參數會覆蓋這個配置
spark.storage.memoryFraction
spark.storage.memory決定了每個Executor可用內存大小,而spark.storage.memoryFraction決定了這部分內存中有多少可以用於Memory Store管理RDD Cache的數據
spark.executor.memory默認為0.6,太大的話會把old gen區域占滿,造成頻繁的全量垃圾回收
如果頻繁發生全量垃圾回收,可降低這個值,但這樣做RDD Cache可用的內存空間減少(部分Cache數據可能需要寫到磁盤上)
spark.streaming.blockInterval
設置Spark Streaming里Stream Receicer生成block的時間間隔,默認為200ms。這個時間間隔應該被StreamingBatch的時間間隔整除
spark.streaming.blockQueueSize決定了streamBlock最多能存儲的容量,默認為10