我在r3.8 xlarge集群上做了一些测试,每个实例都有32个内核,而 244G memory .
如果我设置spark.executor.cores = 16,spark.executor.memory = 94G ,每个实例有2个执行程序,但是当我设置大于94G的spark.executor.memory时,每个实例只有一个执行程序;
如果我设置spark.executor.cores = 8,spark.executor.memory = 35G ,每个实例有4个执行程序,但是当我将spark.executor.memory设置为大于35时,每个实例的执行程序不会超过3个 .
所以,我的问题是,执行程序编号是如何通过内存集出来的?公式是什么?我虽然Spark只是简单地使用70%的物理内存来分配给执行者,但我觉得我错了......
2 回答
在Yarn模式下,您需要通过执行程序 - 内存设置num-executors和executor memory的执行程序数 . 这是一个例子:
现在每个 Actuator 都要求一个带有6G内存开销和1个内核的容器 .
更多信息on spark documentation
关于您所看到的行为,听起来YARN NodeManagers可用的内存量实际上小于操作系统可用的244GB内存量 . 要验证这一点,请查看您的YARN ResourceManager Web UI,您可以看到整个群集中可用的内存总量 . 这是从yarn-site.xml中的
yarn.nodemanager.resource.memory-mb
确定的 .要回答有关如何确定执行程序数量的问题:在YARN中,如果使用spark并将
dynamicAllocation.enabled
设置为true,则执行程序的数量将限制在dynamicAllocation.minExecutors
以上且低于dynamicAllocation.maxExecutors
.除此之外,您将接受YARN的资源分配,对于大多数调度程序,它将分配资源以填充您的作业运行的给定队列 .
如果您有一个完全未使用的集群和一个YARN队列并且您向其提交作业,Spark作业将继续添加具有给定核心数和内存量的执行程序,直到整个集群已满(或者没有)足够的核心/内存,以便分配额外的执行程序) .