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 core。

  以上面為計算原則:

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

 二、RDD持久化

  在spark作業中若是同一個RDD在后面重復使用,需要進行持久化操作。因為

 在默認情況下,多次對一個RDD執行算子,去獲取不同的RDD,都會對這個RDD以及之前的父RDD全部重新計算一遍。所以是十分浪費資源的,所以這種情況是絕對要避免的。

緩存級別如上。

三、廣播變量

  把每個task都要用到的常量,通過廣播變量,發送到每個節點上面,這樣的話,每個節點都會存在一個通用的常量,若是不廣播的話,會造成每個task上面都會存在這個常量,造成資源的浪費。

四、Kryo序列化

  

   通過以上配置,來配置spark作業的序列化方式。

五、調節本地化等待時間

  Spark調優--JVM優化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM