spark性能優化點
-
配置設定更多的資源
1.1 配置設定哪些資源
1.2 在哪裡可以設定這些資源
1.3 參數調節到多大,算是最大
配置設定更多的資源:
它是性能優化調優的王道,就是增加和配置設定更多的資源,這對于性能和速度上的提升是顯而易見的,
基本上,在一定範圍之内,增加資源與性能的提升,是成正比的;寫完了一個複雜的spark作業之後,進行性能調
優的時候,首先第一步,就是要來調節最優的資源配置;在這個基礎之上,如果說你的spark作業,能夠配置設定的資源達到
了你的能力範圍的頂端之後,無法再配置設定更多的資源了,公司資源有限;那麼才是考慮去做後面的這些性能調優的點。
相關問題:
(1)配置設定哪些資源?
(2)在哪裡可以設定這些資源?
(3)剖析為什麼配置設定這些資源之後,性能可以得到提升?
executor‐memory、executor‐cores、driver‐memory
在實際的生産環境中,送出spark任務時,使用spark‐submit shell腳本,在裡面調整對應的參數。
送出任務的腳本:
spark‐submit \
‐‐master spark://node1:7077 \
‐‐class cn.itcast.WordCount \
‐‐num‐executors 3 配置executor的數量
‐‐driver‐memory 1g 配置driver的記憶體(影響不大)
‐‐executor‐memory 1g 配置每一個executor的記憶體大小
‐‐executor‐cores 3 配置每一個executor的cpu個數
/export/servers/wordcount.jar
1.4 為什麼調大資源以後性能可以提升
-
提高并行度
2.1 Spark的并行度指的是什麼
第一種情況:standalone模式
先計算出公司spark叢集上的所有資源 每台節點的記憶體大小和cpu核數,
比如:一共有20台worker節點,每台節點8g記憶體,10個cpu。
實際任務在給定資源的時候,可以給20個executor、每個executor的記憶體8g、每個executor的使用的cpu個數
10。
第二種情況:Yarn
先計算出yarn叢集的所有大小,比如一共500g記憶體,100個cpu;
這個時候可以配置設定的最大資源,比如給定50個executor、每個executor的記憶體大小10g,每個executor使用的cpu
個數為2。
使用原則:你能使用的資源有多大,就盡量去調節到最大的大小(executor的數量:幾十個到上百個不等;executor的
記憶體;exector的cpu個數)
2.2 如何提高并行度
2.2.1 可以設定task的數量
2.2.2 如何設定task數量來提高并行度
2.2.3 給RDD重新設定partition的數量
spark作業中,各個stage的task的數量,也就代表了spark作業在各個階段stage的并行度!
當配置設定完所能配置設定的最大資源了,然後對應資源去調節程式的并行度,如果并行度沒有與資源相比對,那麼導緻你
配置設定下去的資源都浪費掉了。同時并行運作,還可以讓每個task要處理的數量變少(很簡單的原理。合理設定并行度,
可以充分利用叢集資源,減少每個task處理資料量,而增加性能加快運作速度。)
舉例說明:
假如, 現在已經在spark‐submit 腳本裡面,給我們的spark作業配置設定了足夠多的資源,比如50個executor ,每
個executor 有10G記憶體,每個executor有3個cpu core 。 基本已經達到了spark叢集或者yarn叢集上限。task沒有
設定,或者設定的很少,比如就設定了100個task、50個executor、每個executor有3個core ,也就是說
Application 任何一個stage運作的時候,都有總數150個cpu core ,可以并行運作。
但是你現在隻有100個task,平均配置設定一下,每個executor 配置設定到2個task,那麼同時在運作的task,隻有100個
task,每個executor 隻會并行運作 2個task。 每個executor 剩下的一個cpu core 就浪費掉了!你的資源,雖然分
配充足了,但是問題是, 并行度沒有與資源相比對,導緻你配置設定下去的資源都浪費掉了。合理的并行度的設定,應該要
設定的足夠大,大到可以完全合理的利用你的叢集資源; 比如上面的例子,總共叢集有150個cpu core ,可以并行運
行150個task。那麼你就應該将你的Application 的并行度,至少設定成150個,才能完全有效的利用你的叢集資源,
讓150個task并行執行,而且task增加到150個以後,即可以同時并行運作,還可以讓每個task要處理的數量變少; 比
如總共150G的資料要處理, 如果是100個task ,每個task 要計算1.5G的資料。 現在增加到150個task,每個task隻
要處理1G資料。
至少設定成與spark Application 的總cpu core 數量相同(最理想情況,150個core,配置設定150task,一起運
行,差不多同一時間運作完畢)官方推薦,task數量,設定成spark Application 總cpu core數量的2~3倍 。
比如150個cpu core ,基本設定task數量為300~500. 與理想情況不同的,有些task會運作快一點,比如50s就完
了,有些task 可能會慢一點,要一分半才運作完,是以如果你的task數量,剛好設定的跟cpu core 數量相同,可能會
導緻資源的浪費。
因為比如150個task中10個先運作完了,剩餘140個還在運作,但是這個時候,就有10個cpu core空閑出來了,導
緻浪費。如果設定2~3倍,那麼一個task運作完以後,另外一個task馬上補上來,盡量讓cpu core不要空閑。同時盡量
提升spark運作效率和速度。提升性能。
設定參數spark.defalut.parallelism
預設是沒有值的,如果設定了值為10,它會在shuffle的過程才會起作用。
比如 val rdd2 = rdd1.reduceByKey(_+_)
此時rdd2的分區數就是10,rdd1的分區數不受這個參數的影響。
可以通過在建構SparkConf對象的時候設定,例如:
new SparkConf().set("spark.defalut.parallelism","500")