💎

prefect の work-pool / worker について理解する

2024/03/03に公開

はじめに

prefect の構成要素のうち、work-pool / worker について理解します。

work-pool

work-pool は、prefect の work flow を適切なインフラにデプロイするための架け橋となるコンポーネントです。work-pool には様々なタイプを指定できますが、例えば docker のタイプを持つ work-pool を作成した場合、その work-pool から実行された work flow は後述する worker を通して docker コンテナのインフラで起動することになります。
他にも、単一のプロセスとして work flow を起動するタイプの work-pool であったり、kubernetes 上で work flow を起動するタイプの work-pool であったり、色々な種類の work-pool が用意されています。

https://docs.prefect.io/latest/tutorial/work-pools/

work-pool の作成

work-pool を作成してみます。
作成は、prefect UI もしくは prefect CLI から行うことが出来ます。今回は CLI で作成します。
以下のコマンドを実行します。

prefect work-pool create --type docker docker-pool

このコマンドでは、docker のタイプを持つ docker-pool という名前の work-pool を作成しました。

この段階で prefect UI を見てみると、以下のように作成した work-pool を確認できます。

この時点では、作成した work-pool に紐づいている worker が 1 つも無いため、work-pool はステータスが RED になっています。このあと worker について確認すると共に、作成した work-pool に worker を紐づけてみます。

worker

workerは、指定の work-pool を polling し、その work-pool から実行された work flow を対応するインフラ上にデプロイするコンポーネントです。worker を作成する時は、work-pool を紐づける必要があります。例えば docker のタイプを持つ work-pool を紐づけた場合、その worker は work flow を docker コンテナ上にデプロイします。

https://docs.prefect.io/latest/tutorial/workers/

worker の作成

worker を作成してみます。
作成は、prefect CLI から行うことが出来ます。
以下のコマンドを実行します。

prefect worker start --pool docker-pool

このコマンドでは、docker-pool と紐づいた worker を作成しました。

この段階で prefect UI を見てみると、docker-pool のステータスが GREEN に変化しています。また docker-pool の詳細画面に入ると、今回作成した worker が Online 状態になっていることが確認出来ます。


work flow の登録

work-pool と worker が用意できれば、prefect の deployment から work flow を登録してみます。これにより、登録した work flow の実行依頼を出したタイミングで worker が work-pool から work flow を受け取り、worker の管理するインフラ上にデプロイすることが出来ます。

work flow の登録には、以下のようなスクリプトを用います。

import asyncio
import sys

from prefect import flow


@flow(log_prints=True)
async def sample_workflow():
    print("This is sample flow.")


async def deploy():
    await sample_workflow.deploy(
        name="sample-workflow-deployment",
        work_pool_name="docker-pool",
        image=<workflow-container-image>,
        push=False,
        build=False,
    )


if __name__ == "__main__":
    asyncio.run(deploy())

work_pool_name に今回作成した docker-pool を指定しているため、この deployment は docker コンテナ上で起動されます。

終わりに

今回は、 prefect の work-pool / worker を扱いました。
これらのコンポーネントを用いることで、好きなインフラ環境に work flow をデプロイすることが出来ます。

参考

https://docs.prefect.io/latest/tutorial/work-pools/
https://docs.prefect.io/latest/tutorial/workers/

Discussion