赞
踩
参考链接:Stack Overflow
接下来的案例包含了标题中的三方面内容:executor 核心数目,executor 数量,executor 内存。例如 driver memory 这样的参数原文并没有提及。
由于每个 executor 都是一个 JVM 实例,所以我们可以给每个节点分配多个 executor。
为系统的运行保留资源
文章原文的内容是:为了保证操作系统和 hadoop 进程的运行,每个节点要预留 1 个核心 + 1 GB 内存。所以每个节点可用的资源为:15 个核心 + 63 GB RAM。
但是如果你不希望你的系统陷入高负载的情况,你可以多预留一些资源,我个人的使用经验是每个节点预留 4 个核心 + 4 GB 内存。
确定每个 executor 的核心数量——“magic number”
executor 核心数量 = executor 能并发执行的任务(task)数量 ,研究表明,不是给 executor 分配越多的核心越好,任何一个 application 分配的核心数目超过 5 个只会导致性能下降,所以我们一般把 executor 核心数量设置为 5 及 5 以下的数字。在接下来的案例讲解中我们把核心数目设置为 5。
设置 executor 数量
每个节点的 executor 数量 = 15 / 5 = 3, 所以总的 executor 数量为 3 * 6 = 18,由于 YARN 的 ApplicationMaster 需要占用一个 executor,所以我们设置的 executor 数量为 18 - 1 = 17。
设置 executor 分配的内存大小
在之前的步骤中,我们给每个节点分配了 3 个 executor,每个节点可用的 RAM 是 63 GB,所以每个 executor 的内存为 63 / 3 = 21 GB。
但是 spark 在向 YARN 申请内存时,YARN 会给每个 executor 多分配大小为 overhead 的内存,而 overhead = max(384 MB, 0.07 * spark.executor.memory)。在我们的案例中 overhead = 0.07 * 21 = 1.47 GB > 384 MB,所以我们申请的内存大小为 21 - 1.47 ~ 19 GB。
最终我们得到的分配方案是:每个 executor 分配 5 个核心,设置 17 个 executor, 每个 executor 分配的内存为 19 GB。写成 spark-submit 命令为:
spark-submit --master yarn\
--executor-cores 5 --num-executors 17\
--executor-memory 19 filename
参考链接:spark 官方文档
配置 spark 的资源分配为动态分配模式根据 spark 的运行模式(1. standalone 模式 2. YARN 模式 3. Mesos 模式)的不同而略有不同,本文只介绍 YARN 模式的相关配置,详细的配置可以参考上述链接中的官方文档内容。
spark-<version>-yarn-shuffle.jar
,并把它复制到每一个节点的 $SPARK_HOME/yarn
目录中。yarn-site.xml
文件中,在属性 yarn.nodemanager.aux-services
中添加 spark_shuffle
, 并 添加属性 yarn.nodemanager.aux-services.spark_shuffle.class
,值为 org.apache.spark.network.yarn.YarnShuffleService
。如下所示: <property>
<name>yarn.nodemanager.aux-services</name>
<value>spark_shuffle,mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
$SPARK_HOME/conf
目录下找到名为 spark-defaults.conf
的配置文件(如果没有则创建一个),添加如下两个配置:spark.shuffle.service.enabled true
spark.dynamicAllocation.enabled true
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。