深入探究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
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM