Spark運算元選擇策略

2021-07-25 02:15:43 字數 982 閱讀 6089

內容

reducebykey/aggregatebykey底層使用combinerbykey實現,會在map端進行區域性聚合;groupbykey不會

通常對乙個rdd執行filter運算元過濾掉rdd中較多資料後(比如30%以上的資料),建議使用coalesce運算元,手動減少rdd的partition數量,將rdd中的資料壓縮到更少的partition中去。因為filter之後,rdd的每個partition中都會有很多資料被過濾掉,此時如果照常進行後續的計算,其實每個task處理的partition中的資料量並不是很多,有一點資源浪費,而且此時處理的task越多,可能速度反而越慢。因此用coalesce減少partition數量,將rdd中的資料壓縮到更少的partition之後,只要使用更少的task即可處理完所有的partition。在某些場景下,對於效能的提公升會有一定的幫助。

repartitionandsortwithinpartitions是spark官網推薦的乙個運算元,官方建議,如果需要在repartition重分割槽之後,還要進行排序,建議直接使用repartitionandsortwithinpartitions運算元。因為該運算元可以一邊進行重分割槽的shuffle操作,一邊進行排序。shuffle與sort兩個操作同時進行,比先shuffle再sort來說,效能可能是要高的。

在運算元函式中使用到外部變數時,預設情況下,spark會將該變數複製多個副本,通過網路傳輸到task中,此時每個task都有乙個變數副本。如果變數本身比較大的話(比如100m,甚至1g),那麼大量的變數副本在網路中傳輸的效能開銷,以及在各個節點的executor中占用過多記憶體導致的頻繁gc,都會極大地影響效能。

因此對於上述情況,如果使用的外部變數比較大,建議使用spark的廣播功能,對該變數進行廣播。廣播後的變數,會保證每個executor的記憶體中,只駐留乙份變數副本,而executor中的task執行時共享該executor中的那份變數副本。這樣的話,可以大大減少變數副本的數量,從而減少網路傳輸的效能開銷,並減少對executor記憶體的占用開銷,降低gc的頻率。

spark運算元 五 action運算元

collect package com.doit.spark.demoday05 import org.apache.spark.sparkcontext author 向陽木 date 2020 09 22 22 19 description 將資料以陣列形式收集回driver端,資料按照分割槽編...

Spark運算元詳解

目錄 spark常用運算元詳解 3.getnumpartitions 4.partitions 5.foreachpartition 6.coalesce 7.repartition 8.union,zip,join 9.zipwithindex,zipwithuniqueid 未完待續.本文主要介...

spark運算元分類

transformation運算元 不觸發提交作業,完成作業中間處理過程 value資料型別的transformation運算元 輸入分割槽與輸出分割槽一對一型 輸入分割槽與輸出分割槽多對一型 輸入分割槽與輸出分割槽多對多型 輸出分割槽為輸入分割槽子集型 cache型 key value資料型別的t...