我有一个 EMR 集群,正在其中运行带有 Spark 动态分配的 pyspark 作业。
spark.dynamicAllocation.enabled=true
以下是集群配置
1 Node
128GB Ram
10 cores
Core Nodes
Autoscaled till 10 nodes
Each with
128 GB Ram
10 Cores
当我提交作业时,在作业开始时,有近 100 个执行器被创建,然后其中近 95 个执行器在 3 分钟的空闲超时后被 master 杀死。
我的问题是,如果大多数执行器都没有被使用并且只需要 5 个,为什么 Spark 创建了额外的 95 个执行器?
根据我的理解,在动态模式下,spark应该只创建所需数量的执行器。
下面是来自历史服务器的屏幕截图,显示执行者是如何被杀死的。
这与此处的问题和答案相关:为什么要删除 Spark 执行器(日志中带有“ExecutorAllocationManager:请求删除 executorIds”)?
在您工作的整个生命周期中,不同阶段具有不同级别的计算强度。我猜测您所看到的行为之所以会发生,是因为您的工作以大量数据开始,但最终输出却较小。在我们的团队中,我们有很多这样的工作 - 从数十 TB 的数据开始,但输出是几 MB,其中大多数减少是通过 groupBy() 和汇总统计函数的各种应用程序实现的。因此,作业的最后阶段的 shuffle 输入为数百 MB,但初始阶段的输入为数十 TB。因此,既然您有
spark.dynamicAllocation.enabled=true
,Spark 就会创建大量执行器来处理作业初始阶段的负载,然后在作业后期阶段使用更少的执行器时释放它们。