spark效能優化

2021-08-03 05:47:37 字數 2219 閱讀 3693

熟悉spark核心之後,深刻體會到了spark開發中存在著大量細節左右著計算效能。趁著剛看過大概的流程,先基於目前的感受和相關資料,總結一下可能存在優化空間的地方。

spark優化其實就是將不必要的開銷能省就省。

建立rdd是昂貴的,從磁碟讀取rdd也是昂貴的,需要大量的io開銷,shuffle是與基於記憶體相違背的,涉及io、網路通訊等昂貴的操作。。。都是能避免就避免。

有時候會因為極個別的task執行時長嚴重拖慢系統的計算速度,所以需要針對task的昂貴開銷進行優化。

最後,由於集群計算,集群資源的利用也是可以優化的地方。

那麼,根據上述效能優化可以從3個方面入手:

(1)**開發

(2)資料傾斜

(3)資源管理

rdd頻繁建立是昂貴的:

問題的核心就是盡量避免重複計算。建立之後也要盡可能多的重複利用這個rdd

在進行快取的時候,如果面臨大規模資料,記憶體不夠用怎麼辦?

persist手動選擇快取級別:

記憶體夠用:memory_only,不用序列化,不用寫磁碟,很好

記憶體稍微緊張一點:memory_only_ser,會對rdd進行序列化,減小一些記憶體的消耗,同時只是多了序列化和反序列化的操作。

記憶體真的不夠:memory_and_disk_ser、memory_and_disk載入到磁碟

shuffle中的stage分界出會寫讀磁碟檔案,諸如reducebykey、join、repartition等都涉及,能不用就不用。

避免shuffle操作可以使用map+broadcast代替,當然適用場景只有將小規模的資料集合並到大規模資料集,這樣小規模的廣播代價不會太大。

另外可以使用map-side的reduce操作:

典型的是reducebykey和aggregatebykey都會先再本地節點先根據key先區域性聚合,這樣進行讀寫和傳輸的資料將會大大減少。

類似的還有foreach和foreachpartition

特點就是先再本地進行聚合等操作,然後再聚合進行全域性聚合。

乙個stage由若干partition並行執行,決定了並行度,對於每個運算元根據具體的資料量進行設定。

資料分布不均勻,會造成每個task要處理的資料量有極大的差異,由於需要同步完成,所以所有的task都需要等其他都完成才算完成。

由於資料傾斜是因為極個別task的拖後腿行為,所以首要問題是找出task。

在spark web ui上檢視各個stage中各個task分配的資料量。一般都在於shuffle運算元有關的地方,找到後就可以使用countbykey統計一下key的分布。

2.2.1 提高並行度

提高並行度有兩個方面:

乙個是在資料預處理的時候,通過分析檢視某幾個數量格外大的feature,將feature進行編號,比如feature1等,人工將資料的並行度提高,再去掉字尾或者字首進行全域性聚合。

另乙個則是在進行計算的時候,提高partitions的數量,這樣可以增加shuffle操作的並行度,可以減輕資料傾斜的影響。

2.2.2 資料預處理

檢視key的分布,如果只是幾個影響不大的key不均勻,可以直接過濾掉。

資源管理引數在spark-submit中進行設定。資源的分配主要是集群管理器來進行。

資源主要是兩個方面:乙個是cpu核心數量,乙個是記憶體大小。

由於task是以執行緒執行的,所以核心的數量決定了乙個executor鐘的task執行速度。

記憶體包括了業務**所佔記憶體,task對shufflemapout的輸出結果進行計算所需記憶體,還有rdd的持久化策略所保持在記憶體中的rdd。

那麼針對上述情況,有以下幾個引數可以調節:

1.num-executors:其實就是executor的個數;

2.executor-cores:executor中cpu核心的個數,決定了task執行的速度。executor-cores*num-executors<1/2個totalcores。

3.executor-memory:記憶體大小。

4.driver-memory:driver的記憶體,因為有幾個操作是將資料聚合到driver節點操作的,所以注意別溢位了。

5.spark.default.parallelism:並行度,這個引數對任務的影響很大,設定不好就資料傾斜。

6.spark.storage.memoryfraction:持久化所佔記憶體比例,spark基於記憶體的計算,比例要高一點好。

7.spark.shuffle.memoryfraction:shuffle中間結果所佔記憶體。

spark的效能優化

因為之前在tesla集群上申請了1000個節點被噴之後,現在只敢申請100個節點,後來導致乙個嚴重的結果,自從100節點以來再也沒有跑出結果。進而意識到了spark優化的重要性,現再次總結一下 1.乙個通用的調整並行度的方式 首先要明確乙個概念,hadoop為每乙個partition建立乙個task...

spark效能優化二

一 task效能優化 1,慢任務的效能優化 可以考慮減少每個partition處理的資料量,同時建議開啟 spark.speculation,2,儘量減少shuffle,例如我們要儘量減少 groupbykey 的操作,因為 groupbykey 會要求通過網路拷貝 shuffle 所有的資料,優先...

spark效能優化八

一 使用tungsten功能 1,如果想讓您的程式使用tungsten的功能,可以配置 spark.shuffle.manager tungsten sort 2,dataframe中自動開啟了 tungsten 功能 二 tungsten sort base shuffle writer內幕 1,...