1. 程式人生 > >Spark之效能調優總結(一)

Spark之效能調優總結(一)

總結一下spark的調優方案:

一、效能調優

  1、效能上的調優主要注重一下幾點:

    Excutor的數量

    每個Excutor所分配的CPU的數量

    每個Excutor所能分配的記憶體量

    Driver端分配的記憶體數量

  2、如何分配資源

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

./bin/spark-submit \
--class com.spark.sparkTest.WordCount \
--num-executors 3 \ #此處配置的是executor的數量
--driver-memory 100m \ #此處配置的是driver的記憶體(影響不大) --executor-memory 100m \ #配置每個executor的記憶體大小 --total-executor-core 3 \ #配置所有executor的cpu core 數量 /usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \

  如何調節呢??

  常用的資源排程模式有兩種Spark Standalone 和 Spark on Yarn 。比如說你的每臺機器能夠給你使用60G記憶體,10個core,20臺機器。那麼executor的數量是20個。平均每個executor所能分配60G記憶體和10個CPU cor

e。

  以上面為計算原則:

  增加executor:

  如果executor比較少的話,那麼能夠並行執行的task的數量就很少,就意味著,我們的Application的並行執行的能力就很弱。

  如果有3個executor,每個executor有2個core,那麼同時就能夠執行6個task。

  增加了executor之後,意味著能夠並行更多的task。所以速度也就比以前提升了數倍。

  增加每個executor的cpu core:

  增加了執行的並行能力,原來有3個executor,每個有2個core,現在有每個executor有4個core。那麼現在的並行task數量是12,相比以前的6,從物理效能上看提升了2倍。

  增加每個executor的記憶體大小:

  增加記憶體後主要提升了一下三點:

  1、若是RDD進行了cache,那麼有了更多的記憶體,就可以快取更多的資料,寫入磁碟的資料就少了,甚至是可以不用寫入磁碟了,就減少的磁碟IO,寫入速度明顯加快。

  2、對於shuffle操作,reduce端,會需要記憶體來存放拉取的資料進行聚合,如果記憶體不夠,也會寫入磁碟,如果分配更多的記憶體之後,一樣會減少磁碟IO,提升效能。

  3、對於task的執行,會建立很多的物件,如果記憶體過小的話,JVM堆記憶體滿了之後,會頻繁的進行GC操作,垃圾回收等。速度會非常慢,加大記憶體之後就避免了這些問題。

  調節並行度:

  並行度是指spark作業中,各個stage的task的數量。代表了spark作業的各個階段的並行度。

  若是不調節的話會浪費你的資源:

  比如現在spark-submit腳本里面,給我們的spark作業分配了足夠多的資源,比如50個executor,每個executor有10G記憶體,每個executor有3個cpu core。

  基本已經達到了叢集或者yarn佇列的資源上限。task沒有設定,或者設定的很少,比如就設定了100個task,你的Application任何一個stage執行的時候,都有總數在150個cpu core,可以並行執行。但是你現在,只有100個task,平均分配一下,每個executor分配到2個task,ok,那麼同時在執行的task,只有100個,每個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的資料就可以。

 

  很簡單的道理,只要合理設定並行度,就可以完全充分利用你的叢集計算資源,並且減少每個task要處理的資料量,最終,就是提升你的整個Spark作業的效能和執行速度。

  如何調配:

  1、task的數量,至少設定成spark application的總cpu core數量相同。

  2、官方推薦,task的數量設定成spark application總cpu core 的2~3倍。

  3、具體為設定spark.default.parallelism

    SparkConf conf = new SparkConf().set("spark.default.parallelism", "500")

 

 

-----------------------------先寫這麼多,以後更新---------------------------------------------------------------------------------------