← 返回信息流
GitHub 热榜GitHub Trending · 日·1 小时前

Prefect:用于构建弹性数据管道的 Python 工作流编排框架

原标题:PrefectHQ/prefect
Python23,008 stars+55 今日

速览

Prefect 提供声明式工作流定义、自动重试、调度与并发控制,适合 ETL、数据处理、机器学习管道等场景,支持本地和云端运行,并配套 Prefect Cloud 管理平台简化运维。

AI 深度解读

这是什么

Prefect 是一个面向 Python 数据管道的工作流编排框架。它将一个普通的 Python 脚本快速升级为具备生产级可靠性的工作流。通过 flowtask 装饰器,开发者可以在原有代码基础上添加重试、缓存、调度和事件驱动等能力,并在内置的 UI 中实时监控执行状态。项目目前活跃于 GitHub,主语言 Python,Star 数超过 23,000。

解决的问题

数据管道从开发到生产会遇到三个常见问题:

  • 脚本脆弱:单次运行的脚本一旦遇到网络抖动、API 限流或数据格式变化就容易失败,需要手动重跑。
  • 依赖混乱:多个步骤之间存在先后顺序或分支逻辑,手动编排容易出错,且难以追踪失败原因。
  • 运维缺失:没有调度、日志、告警和历史记录,无法知道管道是否按时成功执行,出现问题也难以定位。

Prefect 提供了一整套编排机制,让数据团队能轻松地将原本脆弱的脚本转变为可自动恢复、可调度、可观察的生产级数据管道。

核心功能

  • Flow & Task 抽象:通过 @flow@task 装饰器定义工作流和任务,支持复杂的依赖关系与分支逻辑。任务可以设置重试策略、超时时间、缓存规则,以及基于事件(如 Webhook、SNS 消息)的触发。
  • 调度与部署:内置 Cron 表达式调度,支持 servedeploy 两种方式将工作流转为长期运行的部署,可设定周期性执行或手动/事件触发。
  • 状态管理:每个任务和流程都有明确的状态(Pending、Running、Completed、Failed 等),Prefect server 自动记录状态转换历史,便于调试。
  • UI 与监控:自建 Prefect server 后通过 localhost:4200 打开 Dashboard,可查看工作流执行记录、任务耗时、日志输出,以及触发手动重跑。
  • Prefect Cloud 托管:提供 SaaS 版管理平台,支持多团队协作、RBAC 权限、工作流版本管理、高级告警和成本优化。官方宣称每月自动化超过 2 亿个数据任务。
  • 轻量客户端prefect-client 库专为短暂运行环境(如 AWS Lambda、Spark 任务)设计,只包含与 Prefect Cloud 通信的必要组件,减小部署包体积。

亮点 / 与同类相比

相比 Airflow、Luigi 或 Dagster 等同类框架,Prefect 的主要区别在于:

  • 最低心智负担:用普通 Python 写业务逻辑,加上两个装饰器即可获得编排能力,不需要定义 DAG 图或学习复杂的 DSL。Airflow 需要先理解 DAG、Operator、Task 实例等概念,代码结构也更重。
  • 原生动态管道:Prefect 支持在运行时动态生成任务依赖(例如循环中创建多个同类型任务),而 Airflow 的 DAG 定义需要在解析时静态确定,动态场景需要借助 Dynamic Task Mapping 等新特性。
  • 事件驱动原生:任务可与外部事件(GitHub Webhook、Slack 命令、S3 文件到达)直接绑定,无需额外搭建事件桥接层。Airflow 虽然也支持传感器,但配置更繁琐。
  • 内置回放与缓存:缓存可以按输入签名、标签或 TTL 精细化控制,失败任务支持手动回放并跳过已成功步骤。Luigi 依赖外部状态存储,Airflow 的缓存机制较弱。
  • 社区与生态:拥有超过 25,000 人的 Slack 社区,官方维护了数十个集成(Snowflake、dbt、Slack、S3 等),且允许快速创建自定义集成。Head 公司如 Progressive Insurance、Cash App 在生产中使用。

适合谁用 / 上手

目标用户:数据工程师、ML 工程师、数据分析师以及任何需要将 Python 数据处理脚本稳定化、自动化的人员。尤其适合团队规模不大(10~50 人)但希望快速搭建可靠数据管道的中型数据团队,或希望用最低成本将单机脚本迁移到云上调度的工作组。

上手步骤

  1. 确保 Python 3.10+,运行 pip install -U prefectuv add prefect
  2. 在任意 .py 文件中导入 prefect.flowprefect.task,用装饰器包裹函数。例如下面这段代码会获取 GitHub 仓库的 star 数:
from prefect import flow, task
import httpx

@task(log_prints=True)
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)

if __name__ == "__main__":
    github_stars(["PrefectHQ/prefect"])
  1. 启动本地 UI 服务器:prefect server start,访问 http://localhost:4200 即可看到工作流执行记录。

  2. 如需定时运行,将最后一行改为:

if __name__ == "__main__":
    github_stars.serve(
        name="first-deployment",
        cron="* * * * *",
        parameters={"repos": ["PrefectHQ/prefect"]}
    )

之后每分钟会自动执行一次,也可从 UI 或 CLI 手动触发。更复杂的场景(事件监听、多 worker 并发、依赖外部 API 的前置任务)可查阅官方文档继续深入。

查看原文 →github.com