カーキ色はヒンディー語らしい

技術記事は https://zenn.dev/notrogue

Prefect Orionについて何か書いた

Prefectとは

AirflowやDigDagと同じワークフローエンジンです。

このブログでも紹介していますが、

などがわかりやすいと思います。

英語でもよければ、公式ページ(core部分オーケストレーションの二つ)がわかりやすいです。

Prefect Orionとは

2021/10/6にPrefectがアナウンスした「our second-generation workflow engine」です。

まだTechnical Previewで出ている情報も少ないですが、Prefect Orionについて調べてみようというのが、今回の記事です。

正直、まだぼんやりしています

なにはともあれ触ってみる

Getting startedがあります。

下例では既存のPrefectと分けたいのでPoetry使っていますが、適当に読み替えてください。

# インストール
poetry new advent_calendar_prefect
cd advent_calendar_prefect/advent_calendar_prefect
poetry add "prefect>=2.0.0a"
poetry shell

basic.pyとして保存します。

from prefect import flow, task
from typing import List
import httpx


@task(retries=3)
def get_stars(repo: str):
    url = f"https://api.github.com/repos/{repo}"
    count = httpx.get(url).json()["stargazers_count"]
    print(f"{repo} has {count} stars!")


@flow(name="Github Stars")
def github_stars(repos: List[str]):
    for repo in repos:
        get_stars(repo)


# run the flow!
github_stars(["PrefectHQ/Prefect", "PrefectHQ/miter-design"])

実行

python basic2.py  
07:48:04.506 | Beginning flow run 'merciful-unicorn' for flow 'Github Stars'...
07:48:04.506 | Starting executor `SequentialExecutor`...
07:48:04.731 | Submitting task run 'get_stars-e40861f0-0' to executor...
PrefectHQ/Prefect has 7906 stars!
07:48:05.229 | Task run 'get_stars-e40861f0-0' finished in state Completed(message=None, type=COMPLETED)
07:48:05.319 | Submitting task run 'get_stars-e40861f0-1' to executor...
PrefectHQ/miter-design has 12 stars!
07:48:05.796 | Task run 'get_stars-e40861f0-1' finished in state Completed(message=None, type=COMPLETED)
07:48:05.800 | Shutting down executor `SequentialExecutor`...
07:48:05.882 | Flow run 'merciful-unicorn' finished in state Completed(message='All states completed.', type=COMPLETED)

サーバを起動

prefect orion start

f:id:toukoudo:20211210075028p:plain
prefet_orion

サーバを起動する前に実行したFlowも登録されていることに注目です。

(~/.prefect/orion.dbに情報が保存されるようです)

エラー

常に起きるかは不明ですが、自分の場合以下のエラーがでました(抜粋)。

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: flow
[SQL: INSERT INTO flow (id, created, updated, name, tags) VALUES (?, ?, ?, ?, ?) ON CONFLICT (name) DO NOTHING]
[parameters: ('cb63d353-0279-4e4c-adfd-5bb1254b88d7', '2021-12-06 22:33:35.319780', '2021-12-06 22:33:35.319804', 'my-favorite-function', '[]')]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

DBをリセットするコマンドを実行すると動くようになりました。

prefect orion reset-db

画面を眺める

わくわく

f:id:toukoudo:20211210081034p:plain
トップ画面

f:id:toukoudo:20211210082020p:plain
flow run

f:id:toukoudo:20211210082108p:plain
radar

Prefectとの画面の違い

Technical Previewという事情もあり、Prefectよりも機能は(かなり)少ないです。

例えば、

  • 画面からのFlow実行
  • ログの確認
  • Interactive API

などはありません(未実装なだけなのか、意図的に実装していないのか不明)。

余談ですが、デフォルトポートが衝突(OrionのWebserverとPrefectのApollo Serverが4200)するので、そのままでは同時起動できません。

Radar

現時点でのOrionと従来のPrefectの最大の違いは、Radarかもしれません。

従来のPrefectが上から下に依存関係を配置に応じた配置を行っていたのに対し、Radarでは同心円状に配置し、依存関係のTask同士を結びます。

大規模な場合や、Subflowが多く使われている場合に便利になるらしいです(が、運用してみないとわかりませんね…)。

https://www.prefect.io/assets/img/ui-2.c31b79ad.svg (従来のPrefect。Prefect Core - Prefectより)

f:id:toukoudo:20211211070443p:plain
Radar
(Radar。Introducing Radar - Prefectより)

ビジョンのはなし

Orionが目指していることは、CEOのブログで説明されています。

方向転換というより、従来のPrefectの方向性

  • 通常のPythonコードに近い感じで書ける
  • ローカルでの開発を便利に

をさらに進めたいように感じました。

DAG-free

  • 表現力(ストリーミング、動的な依存…)と、 デベロッパーエクスペリエンスの点で、従来のDAGは制約となっている
  • DAGのようにワークフロー全体を事前に定義するのではなく、実行時に定義することで制約をなくし、 通常のPythonコードのように書けるようにしたい(「code as workflow」)

developer experience

  • 通常のPythonコードのように書ける・ローカルで実行できる(前述の「code as workflow」)
  • スケジュール実行以外は、 Orion Server無しでも同じように実行できる(「ephemeral Orion API」)
  • 広く使われているツールの上に実装することで、採用コストを下げる

※ 通常のPythonコードのように書ける例として、subflowの書き方の変化が紹介されています

youtu.be

orchestration as a service

  • オーケストレーションを、jobの実行ではなく、状態推移を管理するルールと定義
  • Orionではわかりやすいルールエンジンを書いた。これにより、推移した理由がわかりやすく説明できるようになった

機能のはなし

公式ページに大量に機能や、実装の方針が列挙されています(下図)。 ただし、Orion固有ではなくPrefectでも実装されている機能も記載されている気がします(VersioningやMapping)。

個人的には

  • Prefect IDE
  • Serverless Execution
  • The flow never stopps

あたりの記載が気になりました。

www.prefect.io

f:id:toukoudo:20211210094504p:plainf:id:toukoudo:20211210094507p:plainf:id:toukoudo:20211210094510p:plainf:id:toukoudo:20211210094514p:plain
機能たち