我在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%的物理内存来分配给执行者,但似乎我错了......
答案 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个内核的容器。
答案 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作业将继续添加具有给定内核数和内存量的执行程序,直到整个集群已满(或者没有足够的内核/内存来分配额外的执行程序。)