prefect の work-pool / worker について理解する
はじめに
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 が用意されています。
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 コンテナ上にデプロイします。
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 をデプロイすることが出来ます。
参考
Discussion