深刻探究Spark -- Storage存儲的配置

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
相關文章
相關標籤/搜索