原則一:避免建立重複的rdd
原則二:盡可能用同乙個rdd
原則三:對多次使用的rdd進行持久化
如何選擇一種最合適的持久化策略
原則四:盡量避免使用shuffle類運算元
原則五:使用map-side預聚合的shuffle操作:groupbykey 和 reducebykey
原則六:使用高效能的運算元:
原則七:廣播大變數
原則八:使用kryo優化序列化效能
優化資料結構
原則十:data locality
資料傾斜發生時的現象:
- 絕大多數task執行的都非常快,但個別task執行極慢
- 原本能夠正常執行的spark作業,某天突然報出oom(記憶體溢位)異常
資料傾斜發生的最根本原因
如何定位導致資料傾斜的**:
- shuffle(找**裡面發生shuffle的運算元)
- stage劃分 介面觀察就可以定位到是哪個運算元導致的資料傾斜
如何定位到哪個key導致的資料傾斜:
- 方式一: countbykey 有可能出來結果,但是會遇到資料傾斜
- 方式二:sample countbykey
解決方案一:使用hive etl預處理資料
- 方案實現思路—-hive實現預處理
- 方案實現原理—-資料傾斜的發生提前到了hive etl中,避免spark程式發生資料傾斜而已
- 方案優點—–實現起來簡單便捷,效果還非常好,完全規避掉了資料傾斜,spark作業的效能會大幅度提公升
- 方案缺點—–治標不治本,hive etl中還是會發生資料傾斜
解決方案二:過濾少量導致傾斜的key
- 方案實現原理-將導致資料傾斜的key給過濾掉之後,這些key就不會參與計算了,自然不可能產生資料傾斜。
- 方案優點—-實現簡單,而且效果也很好,可以完全規避掉資料傾斜
- 方案缺點—-key對於我們來說,沒有實際意義才行
解決方案三:提高shuffle操作的並行度(沒多大用)
- 方案優點—-實現起來比較簡單,可以有效緩解和減輕資料傾斜的影響
- 方案缺點—-只是緩解了資料傾斜而已,沒有徹底**問題,根據實踐經驗來看,其效果有限。
解決方案四:兩階段聚合(區域性聚合+全域性聚合)
- 方案實現原理—-將原本相同的key通過附加隨機字首的方式,變成多個不同的key,就可以讓原本被乙個task處理的資料分散到多個task上去做區域性聚合,進而解決單個task處理資料量過多的問題。接著去除掉隨機字首,再次進行全域性聚合,就可以得到最終的結果。
- 方案優點—-對於聚合類的shuffle操作導致的資料傾斜,效果是非常不錯的。通常都可以解決掉資料傾斜,或者至少是大幅度緩解資料傾斜,將spark作業的效能提公升數倍以上。
- 方案缺點—-僅僅適用於聚合類的shuffle操作—-groupbykey,join類的shuffle操作
Spark架構原理
本文總結了spark架構原理,其中主要包括五個元件 driver master worker executor和task,簡要概括了每個元件是幹啥的,並總結提交spark程式之後,這五個元件執行的詳細步驟。為了直觀,就把流程圖放在最前面了 driver是乙個程序,我們編寫的spark程式執行在dri...
Spark的架構原理
driver driver是spark集群的節點之一,我們編寫的spark程式就在driver上,由driver程序執行。master master是個程序,主要負責資源的排程和分配,還有集群的監控,等等職責。worker worker是個程序,主要負責兩個方面,乙個是用自己的記憶體儲存rdd的某個...
spark學習12(spark架構原理)
spark採用的是主從式的架構,主節點叫master,從節點是worker 我們編寫的spark就在driver上,由driver程序執行。driver是spark集群的節點之一,或你提交spark程式的機器 master是集群的資源管理者和排程者,類似yarn裡面的resourcemanger,還...