如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优
1. 數據本地化的級別:
1.PROCESS_LOCAL
2.NODE_LOCAL
3.NO_PREF
4.RACK_LOCAL
5.ANY
1) PROCESS_LOCAL
task要計算的數據在本進程(Executor)的內存中。
2) NODE_LOCAL
① task所計算的數據在本節點所在的磁盤上。
② task所計算的數據在本節點其他Executor進程的內存中。
3) NO_PREF
task所計算的數據在關系型數據庫中,如mysql。
4) RACK_LOCAL
task所計算的數據在同機架的不同節點的磁盤或者Executor進程的內存中
5) ANY
跨機架。
2. Spark數據本地化調優:
Spark中任務調度時,TaskScheduler在分發之前需要依據數據的位置來分發,最好將task分發到數據所在的節點上,如果TaskScheduler分發的task在默認3s依然無法執行的話,TaskScheduler會重新發送這個task到相同的Executor中去執行,會重試5次,如果依然無法執行,那么TaskScheduler會降低一級數據本地化的級別再次發送task。
如上圖中,會先嘗試1,PROCESS_LOCAL數據本地化級別,如果重試5次每次等待3s,會默認這個Executor計算資源滿了,那么會降低一級數據本地化級別到2,NODE_LOCAL,如果還是重試5次每次等待3s還是失敗,那么還是會降低一級數據本地化級別到3,RACK_LOCAL。這樣數據就會有網絡傳輸,降低了執行效率。
1) 如何提高數據本地化的級別?
可以增加每次發送task的等待時間(默認都是3s),將3s倍數調大, 結合WEBUI來調節,使任務平均分配,達到三種級別執行所花時間相差最少:
? spark.locality.wait (以下三個參數的默認值參照spark.locality.wait)
? spark.locality.wait.process
? spark.locality.wait.node
? spark.locality.wait.rack
注意:等待時間不能調大很大,調整數據本地化的級別不要本末倒置,雖然每一個task的本地化級別是最高了,但整個Application的執行時間反而加長。
2) 如何查看數據本地化的級別?
通過日志或者WEBUI
3. 內存調優
JVM堆內存分為一塊較大的Eden和兩塊較小的Survivor,每次只使用Eden和其中一塊Survivor,當回收時將Eden和Survivor中還存活著的對象一次性復制到另外一塊Survivor上,最后清理掉Eden和剛才用過的Survivor。也就是說當task創建出來對象會首先往Eden和survivor1中存放,survivor2是空閑的,當Eden和survivor1區域放滿以后就會觸發minor gc小型垃圾回收,清理掉不再使用的對象。會將存活下來的對象放入survivor2中。
如果存活下來的對象大小大于survivor2的大小,那么JVM就會將多余的對象直接放入到老年代中。
如果這個時候年輕代的內存不是很大的話,就會經常的進行minor gc,頻繁的minor gc會導致短時間內有些存活的對象(多次垃圾回收都沒有回收掉,一直在用的又不能被釋放,這種對象每經過一次minor gc都存活下來)頻繁的倒來倒去,會導致這些短生命周期的對象(不一定長期使用)每進行一次垃圾回收就會長一歲。年齡過大,默認15歲,垃圾回收還是沒有回收回去就會跑到老年代里面去了。
這樣會導致在老年代中存放大量的短生命周期的對象,老年代應該存放的是數量比較少并且會長期使用的對象,比如數據庫連接池對象。這樣的話,老年代就會滿溢(full gc 因為本來老年代中的對象很少,很少進行full gc 因此采取了不太復雜但是消耗性能和時間的垃圾回收算法)。不管minor gc 還是 full gc都會導致JVM的工作線程停止。
總結-堆內存不足造成的影響:
1) 頻繁的minor gc。
2) 老年代中大量的短生命周期的對象會導致full gc。
3) gc 多了就會影響Spark的性能和運行的速度。
Spark JVM調優主要是降低gc時間,可以修改Executor內存的比例參數。
RDD緩存、task定義運行的算子函數,可能會創建很多對象,這樣會占用大量的堆內存。堆內存滿了之后會頻繁的GC,如果GC還不能夠滿足內存的需要的話就會報OOM。比如一個task在運行的時候會創建N個對象,這些對象首先要放入到JVM年輕代中。比如在存數據的時候我們使用了foreach來將數據寫入到內存,每條數據都會封裝到一個對象中存入數據庫中,那么有多少條數據就會在JVM中創建多少個對象。
Spark中如何內存調優?
Spark Executor堆內存中存放(以靜態內存管理為例):RDD的緩存數據和廣播變量(spark.storage.memoryFraction 0.6),shuffle聚合內存(spark.shuffle.memoryFraction 0.2),task的運行(0.2)那么如何調優呢?
1) 提高Executor總體內存的大小
2) 降低儲存內存比例或者降低聚合內存比例
如何查看gc?
Spark WEBUI中job->stage->task
總結
以上是生活随笔為你收集整理的如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案制账户几个工作日人民银行备案(备案制
- 下一篇: hutool 获取某月最后一天_huto