Prefect:代理人和执行人的关系?
Prefect: relationship between agent and executor?
根据 Prefect 的混合执行模型,代理“监视任何计划的流程运行并在您的基础设施上相应地执行它们”,而执行者“实际上负责 运行 任务 [...] 用户可以 submit
函数和 wait
的结果。"
虽然从高级设计的角度来看这有一定道理,但实际上这些部分是如何组成的?例如,如果我指定 Flow 运行 应该使用 Docker Agent 和 Dask Executor,那么 Agent 和 Executor 之间具体发生了什么交互?如果我使用 Docker 代理和本地执行器怎么办?还是本地代理和 Dask 执行器?
简而言之,每个组件(即服务器、代理和执行器)中流程的每个步骤究竟发生了什么?
代理代表流程可以并且应该在其上执行的本地基础设施,如该流程的 RunConfig
所指定。如果 Flow 应该仅在 Docker(或 Kubernetes、ECS 或其他任何东西)上 运行,则 Flow 运行 仅由该代理提供服务。代理可以为多个流提供服务,只要这些流都受该特定基础设施的支持。如果流 运行 未绑定到任何特定基础设施,则 UniversalRun
是合适的,并且可以由任何代理处理。最重要的是,代理保证 Prefect Server 永远不会看到与流程相关的代码和数据,方法是向服务器提交流程请求 运行,以及正在进行的流程更新。
执行者,另一方面,负责实际的计算:也就是说,实际上 运行ing 组成流程的各个任务。 Agent 通过以适当的顺序调用 submit
Tasks 并处理 Executor returns 的结果来管理高层的执行。因此,Executor 不知道整个 Flow,而只知道它从 Agent 收到的 Tasks。单个流中的所有任务都需要使用相同的执行器,但代理可以在不同的流之间与不同的执行器通信。同样,Executors 可以服务于多个 Flow 运行,但仅限于 Task 级别。
具体来说:
- 对于 Docker 代理和 Dask 执行器,将有一个 Docker 容器来管理 DAG 的解析和返回服务器的状态报告。不过,每个任务结果的实际计算将发生在该容器之外,在 Dask 分布式集群上。
- 对于 Docker 代理和本地执行器,容器将执行与上述相同的角色。但是,任务结果的计算也将发生在该容器内(该代理的“本地”)。
- 对于本地代理和 Dask 执行器,注册为代理的机器将管理 DAG 解析和与服务器的通信作为该机器上的独立进程,而不是在容器中。尽管每个任务的计算仍然会在外部发生,在 Dask 分布式集群上。
简而言之,代理位于服务器和执行器之间,在流的生命周期中充当保管人运行并描述每个其他组件的关注点分离。
根据 Prefect 的混合执行模型,代理“监视任何计划的流程运行并在您的基础设施上相应地执行它们”,而执行者“实际上负责 运行 任务 [...] 用户可以 submit
函数和 wait
的结果。"
虽然从高级设计的角度来看这有一定道理,但实际上这些部分是如何组成的?例如,如果我指定 Flow 运行 应该使用 Docker Agent 和 Dask Executor,那么 Agent 和 Executor 之间具体发生了什么交互?如果我使用 Docker 代理和本地执行器怎么办?还是本地代理和 Dask 执行器?
简而言之,每个组件(即服务器、代理和执行器)中流程的每个步骤究竟发生了什么?
代理代表流程可以并且应该在其上执行的本地基础设施,如该流程的 RunConfig
所指定。如果 Flow 应该仅在 Docker(或 Kubernetes、ECS 或其他任何东西)上 运行,则 Flow 运行 仅由该代理提供服务。代理可以为多个流提供服务,只要这些流都受该特定基础设施的支持。如果流 运行 未绑定到任何特定基础设施,则 UniversalRun
是合适的,并且可以由任何代理处理。最重要的是,代理保证 Prefect Server 永远不会看到与流程相关的代码和数据,方法是向服务器提交流程请求 运行,以及正在进行的流程更新。
执行者,另一方面,负责实际的计算:也就是说,实际上 运行ing 组成流程的各个任务。 Agent 通过以适当的顺序调用 submit
Tasks 并处理 Executor returns 的结果来管理高层的执行。因此,Executor 不知道整个 Flow,而只知道它从 Agent 收到的 Tasks。单个流中的所有任务都需要使用相同的执行器,但代理可以在不同的流之间与不同的执行器通信。同样,Executors 可以服务于多个 Flow 运行,但仅限于 Task 级别。
具体来说:
- 对于 Docker 代理和 Dask 执行器,将有一个 Docker 容器来管理 DAG 的解析和返回服务器的状态报告。不过,每个任务结果的实际计算将发生在该容器之外,在 Dask 分布式集群上。
- 对于 Docker 代理和本地执行器,容器将执行与上述相同的角色。但是,任务结果的计算也将发生在该容器内(该代理的“本地”)。
- 对于本地代理和 Dask 执行器,注册为代理的机器将管理 DAG 解析和与服务器的通信作为该机器上的独立进程,而不是在容器中。尽管每个任务的计算仍然会在外部发生,在 Dask 分布式集群上。
简而言之,代理位于服务器和执行器之间,在流的生命周期中充当保管人运行并描述每个其他组件的关注点分离。