Spark效能調優之資源分配

2022-08-03 11:12:12 字數 2895 閱讀 5314

效能優化王道就是給更多資源!機器更多了,cpu更多了,記憶體更多了,效能和速度上的提公升,是顯而易見的。基本上,在一定範圍之內,增加資源與效能的提公升,是成正比的;寫完了乙個複雜的spark作業之後,

進行效能調優的時候,首先第一步,我覺得,就是要來調節最優的資源配置;在這個基礎之上,

如果說你的spark作業,能夠分配的資源達到了你的能力範圍的頂端之後,無法再分配更多的資源了,

公司資源有限;那麼才是考慮去做後面的這些效能調優的點。

大體上這兩個方面:core    mem

問題:

1、分配哪些資源?

2、在**分配這些資源?

3、為什麼多分配了這些資源以後,效能會得到提公升?

答案:

1、分配哪些資源?

executor、core per executor、memory per executor、driver memory

2、在**分配這些資源?

在我們在生產環境中,提交spark作業時,用的spark-submit shell指令碼,裡面調整對應的引數

/usr/local/spark/bin/spark-submit \

--class cn.spark.sparktest.core.wordcountcluster \

--num-executors 3 \  配置executor的數量

--executor-memory 100m \  配置每個executor的記憶體大小

--executor-cores 3 \  配置每個executor的cpu core數量

--driver-memory 100m \  配置driver的記憶體(影響很大)

/usr/local/sparktest-0.0.1-snapshot-jar-with-dependencies.jar \

3、調節到多大,算是最大呢?

第一種,spark standalone,公司集群上,搭建了一套spark集群,你心裡應該清楚每台機器還能夠

給你使用的,大概有多少記憶體,多少cpu core;那麼,設定的時候,就根據這個實際的情況,

去調節每個spark作業的資源分配。比如說你的每台機器能夠給你使用4g記憶體,2個cpu core;

20臺機器;executor,20;平均每個executor:4g記憶體,2個cpu core。

第二種,yarn。資源佇列。資源排程。應該去檢視,你的spark作業,要提交到的資源佇列,

hadoop   spark  storm 每乙個佇列都有各自的資源(cpu mem)

大概有多少資源?500g記憶體,100個cpu core;executor,50;平均每個executor:10g記憶體,2個cpu core。

spark-submit的時候怎麼指定資源佇列?--conf spark.yarn.queue default

設定佇列名稱:spark.yarn.queue default

乙個原則,你能使用的資源有多大,就盡量去調節到最大的大小(executor的數量,幾十個到上百個不等;

executor記憶體;executor cpu core)

4、為什麼調節了資源以後,效能可以提公升?

增加executor:

比如有3個executor,每個executor有2個cpu core,那麼同時能夠並行執行的task,就是6個。6個執行完以後,再換下一批6個task。增加了executor數量以後,那麼,就意味著,能夠並行執行的task數量,也就變多了。比如原先是6個,現在可能可以並行執行10個,甚至20個,100個。那麼並行能力就比之前提公升了數倍,數十倍。相應的,效能(執行的速度),也能提公升數倍~數十倍。

增加每個executor的cpu core:

也是增加了執行的並行能力。原本20個executor,每個才2個cpu core。能夠並行執行的task數量,

就是40個task。現在每個executor的cpu core,增加到了5個。能夠並行執行的task數量,就是100個task。執行的速度,提公升了2倍左右。

增加每個executor的記憶體量:

增加了記憶體量以後,對效能的提公升,有三點:

1、如果需要對rdd進行cache,那麼更多的記憶體,就可以快取更多的資料,將更少的資料寫入磁碟

甚至不寫入磁碟。減少了磁碟io

2、對於shuffle操作,reduce端,會需要記憶體來存放拉取的資料並進行聚合。如果記憶體不夠,也會寫入磁碟。如果給executor分配更多記憶體以後,就有更少的資料,需要寫入磁碟,甚至不需要寫入磁碟。減少了磁碟io,提公升了效能。

3、對於task的執行可能會建立很多物件。如果記憶體比較小,可能會頻繁導致jvm堆記憶體滿了,

然後頻繁gc,垃圾**,minor gc和full gc。(速度很慢)。記憶體加大以後,帶來更少的gc,垃圾**,

避免了速度變慢,效能提公升

Spark效能調優之分配資源

結論分配更多的資源才是效能調優的王道。在寫完乙個spark作業後,要進行效能調優的時候,第一件事就是調配更多的資源 如果已經分配到你能力範圍內的資源頂端後,公司無法再給你更多資源了 再考慮其他效能優化的點。筆者後面會寫到更多的效能優化的點 1.分配哪些資源?2.給 分配這些資源?3.資源分配到多大,...

Spark效能調優之Shuffle調優總結

spark底層shuffle的傳輸方式是使用netty傳輸,netty在進行網路傳輸的過程會申請堆外記憶體 netty是零拷貝 所以使用了堆外記憶體。shuffle過程中常出現的問題 常見問題一 reduce oom?問題原因 reduce task 去map端獲取資料,reduce一邊拉取資料一邊...

Spark效能調優 之 運算元調優(二)

map 表示每乙個元素 rrd.foreache 表示每乙個元素 rrd.forpartitions 表示每個分割槽的資料組成的迭代器 在生產環境中,通常使用foreachpartition運算元來完成資料庫的寫入,通過foreachpartition運算元的特性,可以優化寫資料庫的效能。如果使用f...