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 將大規模的文件先分開成不同的...