本文翻译自: 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 性能上起到相当重要的做用。让用户理解配置的正确方法是相当重要的。但愿这篇博客可以帮助你了解这些。