本文翻譯自: Managing Relations Inside Elasticsearch | Elastic
是否曾經有過疑問:--num-executors
, --executor-memory
and --execuor-cores
這些參數該如何配置?緩存
如下是一些配置時的建議內容:服務器
num-executors
時,咱們須要保證留有足夠的 CPU 核樹(每一個節點 1 核)以確保這些守護進程可以順利運行。
從上圖中,咱們須要注意兩件事:併發
spark-executor-memory
+ spark.yarn.executor.memoryOverhead
spark.yarn.executor.memoryOverhead
= Max( 384MB, 7% * spark.executor-memory
)也就是說,若是咱們爲每一個 Executor 申請 20GB內存,AM 實際上將會申請 20GB + memoryOverhead = 20 + 20 * 7% ~= 23GB。elasticsearch
如今,假設咱們有 10 個服務器節點,他們的配置以下:ide
**服務器配置** 節點數:10 單個節點核數:16 單個節點內存:64GB
讓咱們考慮一下不一樣的參數配置:oop
Tiny Executor 意味着每一個 Executor 僅有一個核。下表在這一狀況下的參數配置:性能
- --num-executors = 節點總核數 = 單個節點核數 * 集羣的節點個數 = 16 x 10 = 160 - --executor-cores = 1 ( 每一個 executor 單核 ) - --executor-memory = 每一個 Executor 的內存數 = 每一個節點的內存數 / 每一個節點的 Executor 數 = 64GB / 16 = 4GB
分析: 如上述,當每一個 Executor 僅有一個核時,咱們沒法利用同一 JVM 運行多個 task 的優點。一樣的,利用 broadcast
和 accumulator
進行變量共享/緩存時,須要在每一個節點的每一個核中進行復制操做。此外,咱們也沒有爲 Hadoop/Yarn 守護進程留有足夠的內存資源。這種方法很差。spa
Fat Executor 意味着每一個節點一個 Executor,下表展現了相應的 Spark 配置:線程
- --num-executors = 集羣節點數 = 10 - --executor-cores = 單節點核數 = 16 - --executor-memory = 單節點內存數 / 每一個節點的 Executor 數 = 64GB / 1 = 64GB
分析: 當每一個 Executor 分配 16 核時,除了 AM 和守護進程沒有考慮在內之外,HDFS 的吞吐將會受制,且將會致使國度的 GC。由於,這種方法很差。翻譯
根據咱們以前的建議:
--executor-cores
= 5 ( 爲了更好地 HDFS 吞吐 )--num-executors
= 29--executor-memory
= 21 - 3 = 18 GB於是,推薦的配置爲:29 個 Executor,每一個 Executor:18 GB 內存及 5 核。
分析:不難看出方法三是如何在 Fat 和 Tiny 之間保持平衡的。其保證了 Fat Executor 的並行度及 Tiny Executor 的吞吐量。
以下:
在對 Spark 應用的配置時記住以下建議:
此外,分析三種參數配置方法:
--num-executors
,--executor-cores
and --executor-memory
這三個參數控制了 Spark 應用所能使用的 CPU 數量及內存數,在 Spark 性能上起到相當重要的做用。讓用戶理解配置的正確方法是相當重要的。但願這篇博客可以幫助你瞭解這些。