我什么时候更喜欢 运行 静态分配与动态分配的工作?

When would I prefer to run a job in static allocation vs. dynamic allocation?

我已经阅读了 Foundry 中的文档,了解两者之间的区别,但我想知道在什么情况下我想将 STATIC_ALLOCATION 配置文件应用于我的构建以防止我的执行者被抢占。

在动态分配模式下运行还有什么需要注意的地方吗?

动态分配运行时需要注意的几点:

  1. 当您的执行程序被抢占时,昂贵的任务可能会重新启动,从而导致性能不佳
    • 如果您知道您将有昂贵的任务,您可以考虑将 STATIC_ALLOCATION 配置文件应用于您的构建,这样您就不会被抢占。请注意不要请求比您的构建严格需要更多的执行程序,因为没有其他人能够共享资源。
  2. 可能会错误地估计昂贵的任务,导致抢占时的行为更糟
    • 如果您知道您将有昂贵的任务,您可以考虑将 ADAPTIVE_DISABLED 配置文件应用于您的构建,这样 AQE 就不会错误地估计分区大小,从而导致并行性不佳。 AQE 非常适合 SQL-like 操作,例如 joinwindow 和其他类似的东西,但是当您使用 .udf 或 AQE 无法准确执行的其他特定行为时估计费用,它可能会在实践中伤害你。
    • 如果您最终禁用 AQE,您将只希望在绝对必要的构建中这样做,即 .udf 的许多用途或其他手动行为。它将帮助您在所有其他版本中保持打开状态。
    • 当您禁用 AQE 时,您还需要确保为昂贵的阶段手动调整分区大小,即在最坏的情况下,您将输入中的行数计算到 .udfrepartition() 进入此行数,导致每个任务 1 行。这是可能支付的最大 I/O 成本,但它会导致尽可能少的任务和最大的并行度