Spark:了解动态分配

Spark : Understanding Dynamic Allocation

我已经启动了具有以下配置的 spark 作业:

--master yarn --deploy-mode cluster --conf spark.scheduler.mode=FAIR --conf spark.dynamicAllocation.enabled=true --conf spark.dynamicAllocation.maxExecutors=19 --conf spark.dynamicAllocation.minExecutors=0

它运行良好并成功完成,但在检查 spark 历史记录后 ui,这是我看到的:

我的问题是(我关心的是理解而不是解决方案):

为什么spark在没有任务可做的情况下请求最后一个executor? 如何在动态分配模式下优化作业请求的集群资源?

我在 Yarn 上使用 Spark 2.3.0。

在不知道你提交的作业内容的情况下,很难知道Spark在那里做了什么。不幸的是,您提供的配置字符串并没有说明 Spark 在提交作业时实际执行的操作。

通过查看历史 UI 的 'SQL' 部分(顶部栏的右侧)以及标准输出,您可能会更好地了解任务期间发生的事情日志。

通常,了解 Spark 工作原理的最佳地点之一是官方页面:https://spark.apache.org/docs/latest/cluster-overview.html

快乐火花;)

您需要遵守使用 spark 动态分配的 2 个要求:

  • spark.dynamicAllocation.enable
  • spark.shuffle.service.enabled => 外部 shuffle 服务的目的是允许在不删除 shuffle 文件的情况下删除执行程序。

资源根据工作量动态调整。如果您不再使用该应用,该应用将归还资源。

我不确定是否有命令,它只会以指数方式轮流请求执行器,即:应用程序将在第一轮添加 1 个执行器,然后是 2、4、8 等等...

Configuring external shuffle service

这是因为分配策略:

Additionally, the number of executors requested in each round increases exponentially from the previous round.

reference