1. 程式人生 > 實用技巧 >css偽元素:before和:after用法以及在img中使用失效問題

css偽元素:before和:after用法以及在img中使用失效問題

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