8

根据 Prefect 的混合执行模型,代理“监视任何计划的流程运行并在您的基础架构上相应地执行它们”,而执行器“负责实际运行的任务 [...] 用户可以运行的任务submit及其wait结果。”

虽然从高级设计的角度来看这是有道理的,但实际上这些部分是如何组成的?例如,如果我指定 Flow Run 应该使用 Docker Agent 和 Dask Executor,那么 Agent 和 Executor 之间具体发生了哪些交互?如果我使用 Docker 代理和本地执行程序会怎样?还是本地代理和 Dask 执行器?

简而言之,每个组件(即服务器、代理和执行程序)中流程的每个步骤到底发生了什么?

4

1 回答 1

9

代理代表 Flow 可以并且应该在其上执行的本地基础架构,由该 Flow 的RunConfig. 如果 Flow 仅应在 Docker(或 Kubernetes、ECS 或其他任何东西)上运行,则 Flow Run 仅由该代理提供服务。代理可以为多个流提供服务,只要这些流都受该特定基础设施的支持。如果 Flow Run 不绑定到任何特定的基础设施,则 aUniversalRun是合适的,并且可以由任何代理处理。最重要的是,代理通过向服务器提交请求以使 Flows 运行以及正在进行的 Flows 更新,确保 Prefect Server 永远不会看到与 Flows 关联的代码和数据。

另一方面,执行者负责实际计算:即实际运行构成流的各个任务。submit代理通过以适当的顺序调用任务并通过处理执行器返回的结果来管理高级别的执行。正因为如此,Executor 不知道整个 Flow,而只知道它从 Agent 接收到的 Tasks。单个 Flow 中的所有 Task 都需要使用相同的 Executor,但一个 Agent 可以在不同的 Flow 之间与不同的 Executor 进行通信。同样,Executors 可以服务于多个 Flow Runs,但仅限于 Task 级别。

具体来说:

  • 对于 Docker 代理和 Dask Executor,会有一个 Docker 容器来管理 DAG 的解析和返回给服务器的状态报告。但是,每个任务结果的实际计算将发生在该容器之外,在 Dask 分布式集群上。
  • 对于 Docker 代理和本地执行程序,容器将执行与上述相同的角色。但是,任务结果的计算也将发生在该容器内(该容器的“本地”)。
  • 对于本地代理和 Dask 执行器,注册为代理的机器将管理 DAG 解析和与服务器的通信,作为该机器上的独立进程,而不是在容器内。但是,每个任务的计算仍将在外部,在 Dask 分布式集群上进行。

简而言之,Agent 位于 Server 和 Executor 之间,充当 Flow Run 生命周期的保管人,并为每个其他组件描述关注点的分离。

于 2021-04-05T20:57:30.270 回答