熟悉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,...