Spark為什麼會出現異常記憶體溢位?

2021-10-18 04:34:29 字數 824 閱讀 7380

一、疑問:spark記憶體不夠的時候,不是會寫入硬碟麼

1、某文章:

1,當有多個 task 同時在 executor 上執行時, 將會有多個 taskmemorymanager 共享 memorymanager 管理的記憶體。那麼 memorymanager 是怎麼分配的呢?答案是每個任務可以分配到的記憶體範圍是 [1 / (2 * n), 1 / n],其中 n 是正在執行的 task 個數。因此,多個併發執行的 task 會使得每個 task 可以獲得的記憶體變小。

2,前面提到,在 memoryconsumer 中有 spill 方法,當 memoryconsumer 申請不到足夠的記憶體時,可以 spill 當前記憶體到磁碟,從而避免無節制的使用記憶體。但是,對於堆內記憶體的申請和釋放實際是由 jvm 來管理的。因此,在統計堆內記憶體具體使用量時,考慮效能等各方面原因,spark 目前採用的是抽樣統計的方式來計算 memoryconsumer 已經使用的記憶體,從而造成堆內記憶體的實際使用量不是特別準確。從而有可能因為不能及時 spill 而導致 oom。

2、知乎大佬回答:

(1)記得某本書上講到過:

非序列化的記憶體物件大小採集是抽樣獲取的,因此儘管executor在執行時會計算當前記憶體使用量.但是這個使用量並非是完全準確的值.

這樣,在某些特定場景下,就會導致統計值小於實際使用值,然後造成沒有往磁碟spill的操作.

(2)回答就是,處理規模比較大的資料的時候spark的魯棒性其實還沒有那麼強,需要使用者自己繞過這些坑。

(當然這個也是有用的,這部分的內容一般會被作為是否真正用過spark處理真實場景下大規模資料的面試題。逃~

二、spark記憶體溢位怎麼解決?

1、

異常,程式中為什麼會出現異常,丟擲異常的方式

1 什麼是異常?異常即是乙個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。一般情況下,在python無法正常處理程式時就會發生乙個異常。異常是python物件,表示乙個錯誤。當python指令碼發生異常時我們需要捕獲處理它,否則程式會終止執行。2 為什麼會丟擲異常 拋異常是為了讓當次執行...

陣列越界會出現什麼 為什麼會出現刺繡?

為什麼會出現刺繡,可能各個地方的繡種不同,答案也不盡相同。查翻資料,今天談談地處江南地區的 蘇繡 是為何出現。蘇繡的出現離不開四個字 斷髮文身 斷髮文身的古人 蘇繡至今已有2000餘年的歷史,傳說 於仲雍的孫女 女紅 首製繡衣。古代周太王古公亶父的兒子太伯 仲雍來到今江南蘇州一帶建立了吳國,當地人有...

為什麼會出現死鎖

今天在閱讀 我在思考乙個 如何可以抵擋得住大的迸發量,我先羅列我應該會設計的方案,然後再分析其中實現應該注意的地方 首先如果資料量很大的話,我們是要分散請求的,也就是需要伺服器來聯合作戰,當然這裡我們就需要有乙個好的輪詢的演算法,不然會出現資料無法保持一致而導致程式中隱藏bug,所以說,考慮的方面不...