首先让我解释一下在 YARN 集群上调整 Spark 应用程序所需的一组基本属性。
Note:YARN中的Container相当于Spark中的Executor。为了便于理解,您可以认为两者是相同的。
在纱线站点.xml 上:
yarn.nodemanager.resource.memory-mb
是给定节点上集群可用的总内存。
yarn.nodemanager.resource.cpu-vcores
是给定节点中集群可用的 CPU vcore 总数。
yarn.scheduler.maximum-allocation-mb
是每个纱线容器可以分配的最大内存(以 mb 为单位)。
yarn.scheduler.maximum-allocation-vcores
是每个纱线容器可以分配的最大 vcore 数量。
Example:如果节点有 16GB 和 8vcore,并且您想向集群贡献 14GB 和 6vcore(对于容器),则设置属性如下所示:
纱线.nodemanager.resource.内存-mb:14336(14GB)
纱线.nodemanager.resource.cpu-vcores:6
并且,要创建每个具有 2GB 和 1vcore 的容器,请设置以下属性:
纱线.scheduler.最大分配-mb:2049
纱线.scheduler.最大分配-vcores : 1
Note:即使有足够的内存(14GB)来创建 7 个 2GB 的容器,上述配置也只会创建 6 个 2GB 的容器,并且 14GB 中只有 12GB 将用于集群。这是因为集群只有 6 个可用的 vcore。
现在在 Spark 方面,
以下属性指定每个执行程序/容器请求的内存
spark.driver.memory
spark.executor.memory
以下属性指定每个执行程序/容器请求的 vcore
spark.driver.cores
spark.executor.cores
IMP: 所有 Spark 的内存和 vcore 属性都应小于或等于 YARN 的配置
以下属性指定 YARN 集群中可用于 Spark 应用程序的执行器/容器的总数。
spark.executor.instances
此属性应小于 YARN 集群中可用容器的总数。
一旦纱线配置完成,火花应该请求容器可以根据YARN配置进行分配。这意味着,如果 YARN 配置为每个容器最多分配 2GB 并且 Spark 请求具有 3GB 内存的容器,则作业将暂停或停止,因为 YARN 无法满足 Spark 的请求。
现在为您的用例:通常,集群调整是基于工作负载的。但下面的配置应该更合适。
可用内存:10GB*2节点可用 Vcore:5 * 2 vcores [假设]
在yarn-site.xml上[在两个节点中]
yarn.nodemanager.resource.memory-mb
: 10240
yarn.nodemanager.resource.cpu-vcores
: 5
yarn.scheduler.maximum-allocation-mb
: 2049
yarn.scheduler.maximum-allocation-vcores
: 1
使用上述配置,您可以在每个节点上最多创建 10 个容器,每个容器具有 2GB,1vcore。
火花配置
spark.driver.memory
1536mb
spark.yarn.executor.memoryOverhead
512mb
spark.executor.memory
1536mb
spark.yarn.executor.memoryOverhead
512mb
spark.driver.cores
1
spark.executor.cores
1
spark.executor.instances
19
请随意尝试这些配置以满足您的需求。