如何在YARN模式下通过内存设置执行程序编号?

时间:2016-02-11 20:13:00

标签: apache-spark

我在r3.8 xlarge集群上做了一些测试,每个实例有32个内核, 244G内存

如果我设置spark.executor.cores = 16,spark.executor.memory = 94G ,每个实例都有2个执行器,但是当我设置spark.executor.memory大于94G,每个实例只有一个执行器;

如果我设置spark.executor.cores = 8,spark.executor.memory = 35G ,每个实例都有4个执行器,但是当我设置spark.executor.memory大于35,每个实例不会有超过3个执行程序。

所以,我的问题是,执行器编号是如何通过内存集出来的?公式是什么?我虽然Spark只是简单地使用了70%的物理内存来分配给执行者,但似乎我错了......

2 个答案:

答案 0 :(得分:0)

在Yarn模式下,您需要通过执行程序 - 内存设置num-executors和executor memory的执行程序数。这是一个例子:

spark-submit --master yarn-cluster --executor-memory 6G --num-executors 31 --executor-cores 32 example.jar Example

现在每个执行者都要求一个容量为6G +内存开销和1个内核的容器。

更多信息on spark documentation

答案 1 :(得分:0)

关于您所看到的行为,您的YARN NodeManagers可用的内存量实际上小于操作系统可用的244GB内存量。要验证这一点,请查看您的YARN ResourceManager Web UI,您可以看到整个群集中可用的内存总量。这是从yarn-site.xml中的yarn.nodemanager.resource.memory-mb确定的。

回答关于如何确定遗嘱执行人数的问题:在YARN中,如果您使用设置为dynamicAllocation.enabled的{​​{1}}的火花,则执行者的数量将限制在dynamicAllocation.minExecutors以上且低于dynamicAllocation.maxExecutors

除此之外,您还需要进行YARN的资源分配,对于大多数调度程序,这将分配资源来填充您的作业运行的给定队列。

如果您有一个完全未使用的集群,其中有一个YARN队列,并且您向其提交了作业,则Spark作业将继续添加具有给定内核数和内存量的执行程序,直到整个集群已满(或者没有足够的内核/内存来分配额外的执行程序。)