首页 文章

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

提问于
浏览
1

我在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 回答

  • 0

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

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

    现在每个 Actuator 都要求一个带有6G内存开销和1个内核的容器 .

    更多信息on spark documentation

  • 0

    关于您所看到的行为,听起来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作业将继续添加具有给定核心数和内存量的执行程序,直到整个集群已满(或者没有)足够的核心/内存,以便分配额外的执行程序) .

相关问题