如何使用执行程序使我的 Spark 作业 运行 更快?

How do I make my Spark job run faster using executors?

我知道我的代码没有反模式,因为我的创作代码编辑器中没有任何警告,所以我知道我的代码正在执行分布式和可扩展的 PySpark 操作。

我当前的作业有 2 个执行程序分配给它,每个执行程序有 2 个内核,并且它 运行 的任务并行度为 16,如 Spark 详细信息页面所示。​​

如何使这项工作 运行 更快?

您的执行器是分配给 'execute' 您的工作的 Spark 基础设施的一部分。因此,您拥有的这些 'workers' 越多,您能够并行完成的工作就越多,您的工作就会越快。

但是,您的作业速度增加量是有限制的,这是您阶段中最大任务数的函数。注意:使用 AQE,您的最大任务数会随着执行者数量的增加而增加,因此您会注意到任务数会增加到某个点。

例如,如果我的数据规模是这样的,我最多只有 8 个任务(假设 正在控制它),则将执行器计数分配给 运行 超过 8任务会浪费资源并且不会提高您的工作速度(请注意,AQE 可能会在您添加执行程序时调整您的任务计数,因为它检测到更多工作可以 运行 并行)。

大多数 Foundry 环境中的默认作业是 2 个执行器,每个执行器有 2 个内核,每个任务有 1 个内核。这意味着您的作业能够一次 运行 4 个核心,这意味着 4 个任务。

这意味着如果您的工作中每个阶段的最大任务计数为 4,您将不会从增加执行者数量中获益。但是,如果您观察到您的阶段有 16 个任务,那么您可以选择增加作业中的执行者数量:

最多 16 个任务,每个任务 1 个核心。 -> 需要 16 个内核。
每个执行器 2 个内核 -> 最多 8 个执行器。

因此,我们可以将此示例作业跳到最多 8 个执行程序以获得最佳性能。

对于最初的问题,假设 AQE 没有增加您的任务计数,您会将执行器的数量增加到 8 个以获得最佳性能。

当 AQE re-examines 你的工作和新的执行者数量时,它会检测到更多任务可以 运行 并行,因此会增加你的任务数量以尝试匹配基础设施。但是,当它执行此操作时,您最终可能会遇到比您想要的要小的任务。

AQE 决定任务大小(以及因此 运行 处理多少任务)的方式基于设置 spark.sql.adaptive.advisoryPartitionSizeInBytes 和作业中可用的核心总数.如果您的内核数量多于值得并行化的数量(即混洗分区太小),那么这些小分区将合并为更少的数量,这意味着您在没有 AQE 的情况下会遇到同样的执行器浪费问题。

AQE 将根据您提供的执行器数量尽力而为,因此您可能会发现随着更多的执行器达到一定程度,它会变得越来越快。在这一点上,更多的执行者并不意味着更快的工作,这是因为你的分区太小,不值得分成更小的任务,你已经开始浪费执行者