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