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
以上面為計算原則:
增加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")
-----------------------------先寫這麼多,以後更新---------------------------------------------------------------------------------------