日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优

發布時間:2023/12/2 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何查看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优化(三)----数据本地化及内存调优的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。