天天看點

spark性能調優

spark性能優化點

  1. 配置設定更多的資源

    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 為什麼調大資源以後性能可以提升

  1. 提高并行度

    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")

繼續閱讀