性能調優的王道是分配更多的資源,當目前資源夠用的狀況下,分配的資源越充分,在性能和速度上的提高越明顯。當資源沒法分配更多時候纔會去考慮後續的一些調優手段。shell
1,分配的 executor 數量;併發
2,每一個 executor 須要的 core 數量;性能
3,每一個 executor 須要的內存大小;spa
4,driver 的內存大小 (這個影響不大) ;線程
提交 spark 做業時,用的 spark-submit 的 shell 腳本,裏面有對應的參數:對象
—num-executors 3 \ 配置的 executor 數量隊列
—driver-memory 100m \配置的 driver 內存進程
— executor-memory 100m \配置每一個 executor 的內存大小內存
— executor-cores 3 \配置的每一個 executor 的核心數量資源
**第一種,Spark Standalone 模式。**公司搭建的 Spark 集羣上,有多少臺機器,每臺機器有多少的內存,每臺機器的 cpu 是幾核的,這些參數要有數,而後根據這些參數去分配 Spark 做業的資源分配。
好比說,集羣上有 20 臺機器,每臺有 4g 內存,每臺的 cpu 有兩個核心。那麼能夠這麼分配資源:20 個 executor,每一個 executor 分配 4g 的內存和 2 個 core。
**第二種,使用 Yarn 做爲資源調度的集羣。**這種集羣,須要去查看你的 Spark 做業提交到的資源隊列大概有多少資源,而後分配。
好比說,該資源隊列有 500g 的內存,100 個 cpu 核心。那麼能夠分配 50 個 executor,每一個 executor 分配 10g 的內存和 2 個 core。
1,Spark 應用啓動在 Driver 進程中,因此 Driver 內存的分配大一些能夠適當提高 Driver 進程的執行速度;
2,Spark 應用會被拆分紅多個 job,每一個 job 又會被劃分紅多個 stage,每一個 stage 會被分配多個 task 去執行。這些 task 最後都會被分配到 worker 上的 executor 進程中執行,每一個 task 在 executor 進程中是一個線程在執行。
這樣就能夠看出,若是集羣資源充分的話,executor的數量越多,執行速度就越快。
當 executor 所在進程的 JVM 分配的核心越多(要配合該 worker 節點的 cpu 核心數量來定),越有助於提高執行效率,由於 executor 內部執行任務的 task 線程是併發執行的,在 worker 節點的 cpu 核心數量越多的狀況下,並行度就越高。
另外,因爲 Spark 應用有時會須要對 RDD 進行 cache 操做,shuffle 操做的 map 端和 reduce 端須要存放數據,在 task 執行的時候也會建立出不少的對象,這三個因素都須要內存,因此內存大也會提高 Spark 的性能。