css偽元素:before和:after用法以及在img中使用失效問題
阿新 • • 發佈:2020-10-15
Spark內容
1.Spark的記憶體模型 2.Spark的執行過程 3.SparkSQL的執行過程
本次主要整理記憶體模型相關內容
Spark的記憶體模型
1.Spark2.0採用的是統一記憶體管理方式 unified Memory Manager
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等計算過程中的臨時資料;
2. 驅動器和執行器功能
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 堆外記憶體
3.記憶體溢位有兩點:
1. Driver 記憶體不夠 2. Executor 記憶體不夠 Driver 記憶體不夠: 1. 讀取資料太大 2. 資料回傳 Executor 記憶體不夠: 1. map 類操作產生大量資料,包括 map、flatMap、filter、mapPartitions 等 2. shuffle 後產生資料傾斜 Driver記憶體溢位的解決方式: 讀取資料太大 增加 Driver 記憶體,具體做法為設定引數 --driver-memory collect 大量資料回傳 Driver,造成記憶體溢位:解決思路是 分割槽輸出 Executor記憶體溢位解決方式 map 過程產生大量物件 解決思路是 減少每個 task 的大小,從而減少每個 task 的輸出; 具體做法是在 會產生大量物件的 map 操作前 新增 repartition(重新分割槽) 方法,分割槽成更小的塊傳入 map 解決思路: 用 mapPartitions 替代多個 map,減少 Executor 記憶體壓力 shuffle: broadcast join 快取 RDD 既可以節省記憶體,也可以提高性 DataFrame 代替 RDD Reduce 增加 reduce 並行度其實就是增加 reduce 端 task 的數量, 這樣每個 task 處理的資料量減少,避免 oom
4.資料傾斜
常見的問題解決方式: 發現-- 定位 --確認 --解決
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
5.Java記憶體
主要的圖例:
參考:
Spark資料傾斜之發現篇 https://blog.csdn.net/dpengwang/article/details/83213825
Spark效能優化指南——高階篇 (很詳細) https://blog.csdn.net/lukabruce/article/details/81504220