Spark開發 記憶體模型

2022-09-17 06:51:10 字數 3200 閱讀 2076

1.spark的記憶體模型 2.spark的執行過程 3.sparksql的執行過程
01.特點是: 儲存記憶體和計算內存在同一空間,並且可以動態的使用彼此的空閒區域

02.構成: 記憶體分為堆內記憶體和堆外記憶體

001.堆外記憶體式由spark控制,直接在工作節點的系統記憶體中開闢空間,即對於大記憶體,spark自行和記憶體打交道

堆外記憶體只區分 execution 記憶體和 storage 記憶體

這部分使用者**無法直接操作。 堆外記憶體部分主要用於jvm自身,如字串、nio buffer等開銷,

另外還有部分堆外記憶體由spark.memory.offheap.enabled及spark.memory.offheap.size控制的堆外記憶體,這部分也歸offheap,

但主要是供統一記憶體管理使用的。

002.堆內記憶體依賴jvm,

– execution memory execution 記憶體 主要用於存放 shuffle、join、sort、aggregation 等計算過程中的臨時資料

– storage memory storage 記憶體 主要用於儲存 spark 的 cache 資料,例如rdd的快取、unroll資料

– user memory 使用者記憶體(user memory) 主要用於儲存 rdd 轉換操作所需要的資料,例如 rdd 依賴等資訊

– reserved memory 預留記憶體(reserved memory) 系統預留記憶體,會用來儲存spark內部物件

動態占用-- 儲存記憶體和計算記憶體 一般我們使用的spark.driver.memory 和 spark.executor.memory

spark在乙個executor中的記憶體分為三塊,一塊是execution記憶體,一塊是storage記憶體,一塊是other記憶體

storage memory 和 executor memory

executor memory: 主要儲存shuffle、join、sort、aggregation等計算過程中的臨時資料;

driver和executor都是jvm程序,記憶體由memorymanager統一管理

driver的功能

1)乙個spark作業執行時包括乙個driver程序,也是作業的主程序,具有main函式,

並且有sparkcontext的例項,是程式的人口點;

2)功能:負責向集群申請資源,向master註冊資訊,負責了作業的排程,

負責作業的解析、生成stage並排程task到executor上。包括dagscheduler,taskscheduler

executor

01.executor 的記憶體管理建立在 jvm 的記憶體管理之上

executor 內執行的併發任務共享 jvm 堆內記憶體,這些記憶體被規劃為 儲存(storage)記憶體 和 執行(execution)記憶體

一塊兒是專門用來給rdd的cache、persist操作進行rdd資料快取用的;

另外一塊兒,用來給spark運算元函式的執行使用的,存放函式中自己建立的物件

02. executor 堆外記憶體

1. driver 記憶體不夠  2. executor 記憶體不夠

driver 記憶體不夠: 1. 讀取資料太大

2. 資料回傳

2. shuffle 後產生資料傾斜

driver記憶體溢位的解決方式:

讀取資料太大 增加 driver 記憶體,具體做法為設定引數 --driver-memory

collect 大量資料回傳 driver,造成記憶體溢位:解決思路是 分割槽輸出

executor記憶體溢位解決方式

map 過程產生大量物件

解決思路是 減少每個 task 的大小,從而減少每個 task 的輸出;

具體做法是在 會產生大量物件的 map 操作前 新增 repartition(重新分割槽) 方法,分割槽成更小的塊傳入 map

shuffle:

broadcast join

快取 rdd 既可以節省記憶體,也可以提高性

dataframe 代替 rdd

reduce

增加 reduce 並行度其實就是增加 reduce 端 task 的數量, 這樣每個 task 處理的資料量減少,避免 oom

常見的問題解決方式: 發現-- 定位 --確認 --解決

1.資料傾斜

01.什麼現象看出有資料傾斜 -發現傾斜 -會看日誌

表現一:某個stage執行時間過長

表現二:shuffle read的資料量和shuffle write的資料量相差巨大

表現三:點進stage首席執行官的,檢視task的運**況 task執行時間過長,讀寫資料量相差巨大

表現四: 某個executor上執行時間過長

02.**出現了傾斜--定位傾斜

哪段**造成了傾斜,資料傾斜發生在哪乙個stage之後,接著我們就需要根據stage劃分原理,

推算出來發生傾斜的那個stage對應**中的哪一部分,這部分**中肯定會有乙個shuffle類運算元

(注: 需要了解最基本的stage劃分的原理,以及stage劃分後shuffle操作是如何在兩個stage的邊界處執行)

通過dag圖檢視

還可以看看 異常棧資訊就可以定位到你的**中哪一行發生了記憶體溢位。然後在那行**附近找找

03.怎麼解決傾斜-解決傾斜

分析一下那個執行了shuffle操作並且導致了資料傾斜的rdd/hive表,檢視一下其中key的分布情況

資料傾斜: 1. 過濾導致傾斜的 key 2. 使用隨機 key 進行雙重聚合

3.兩階段聚合(區域性聚合+全域性聚合)

4.提高shuffle操作的並行度

sample 取樣對傾斜 key 單獨進行 join

2.資源調優-診斷記憶體的消耗,針對記憶體調優

對多次使用的rdd進行持久化或checkpoint

主要的圖例:

spark資料傾斜之發現篇 

spark效能優化指南——高階篇 (很詳細)

Spark(六) Spark計算模型

整個spark框架都是基於rdd運算元來進行計算的。what is rdd?resilient distributed dataset rdd 分布式彈性資料集,是spark上的乙個核心抽象 表示用於平行計算的,不可修改的,對資料集合進行分片的資料結構 簡單地,可以將rdd看成是spark平台上的通...

Spark2 X的記憶體管理模型

spark2.x的記憶體管理模型如下圖所示 spark中的記憶體使用大致包括兩種型別 執行和儲存。執行記憶體是指用於用於shuffle join 排序 聚合等計算的記憶體,而儲存記憶體是指用於在集群中持久化和廣播內部資料的記憶體。在spark中,執行記憶體和儲存記憶體共享乙個統一的區域。當沒有使用執...

Spark 模型總結

註明 以及相關資料均來自scalable machine learning from berkelyx,只是個人總結使用,侵權即刪 mr的價值體現在對大資料集的分布式處理上。如下面的圖例 來自scalable machine learning from berkelyx 將大規模的文件先分開成不同的...