對於rdd中某些函式使用注意
1.能不使用groupbykey函式就不使用,除非不得已
redcuebykey(combiner) = groupby+ map(變數值相加)
redcuebykey可以先進行本地聚合操作
2.盡量使用xxpartition函式代替xx函式
xx:map/foreach/zip
def foreach(f: t => unit): unit
f:針對rdd中每個元素進行的操作處理的
def foreachpartition(f: iterator[t] => unit): unit
f:針對rdd中每個分割槽的元素進行操作處理的
比如rdd中2個分割槽,100條資料,現將資料報道mysql表中
foreach
item ->mysql
connection ->建立100次
foreachpartition
對每個分割槽中資料
只要獲取2個連線即可
3.適當的降低或者增加rdd分割槽數目
rdd的分割槽對應乙個task處理資料
def repartition(numpartitions: int) -產生shuffle
def coalesce(numpartitions: int, shuffle: boolean = false)
一開始的時候,資料量比較多,可以加到rdd分分割槽數,增加並行度(在集群資源充足的情況下)
當資料預處理之後(尤其過濾清洗之後)。rdd中資料量減少了很多,此時可以考慮減少分割槽的數目
二 Spark效能調優 RDD優化
在對 rdd 進行運算元時,要避免相同的運算元和計算邏輯之下對 rdd 進行重複的計算,優化前如圖 優化後如圖 在 spark 中,當多次對同乙個 rdd 執行運算元操作時,每一次都會對這個 rdd以之前的父 rdd 重新計算一次,這種情況是必須要避免的,對同乙個 rdd 的重複計算是對資源的極大浪...
spark效能調優之重構RDD架構,RDD持久化
當第一次對rdd2執行運算元,獲取rdd3的時候,就會從rdd1開始計算,就是讀取hdfs檔案,然後對rdd1執行運算元,獲取到rdd2,然後再計算,得到rdd3 預設情況下,多次對乙個rdd執行運算元,去獲取不同的rdd 都會對這個rdd以及之前的父rdd,全部重新計算一次 讀取hdfs rdd1...
spark效能調優 RDD持久化
第一,rdd重構與優化 盡量去復用rdd,差不多的rdd,可以抽取成為乙個共同的rdd,供後面的rdd計算時,反覆使用。第二,公共rdd一定要實現持久化 持久化,也就是說,將rdd中的資料快取到記憶體中,或者快取到磁碟中,blockmanager 以後無論對這個rdd做多少次計算,那麼都是直接取rd...