跳转至主要内容
Prefect 中的资产代表了 Prefect 工作流的任何结果或输出。它们提供了一个接口,用于对各种数据和模型血缘进行建模、跟踪数据转换之间的依赖关系,并从资产层面而非仅仅计算层面监控流水线的健康状况。

核心概念

资产从根本上由其 key(键) 定义,这是一个唯一标识资产的 URI,通常指定资产所在的外部存储系统。资产键既是标识符又是组织结构——资产会根据其 URI 方案(例如 s3://, postgres://, snowflake://)自动分组,并可根据其路径结构进行分层组织。 资产在 Prefect 中主要存在三种状态:
  • 物化 (Materialized):资产已被 Prefect 工作流创建、更新或覆盖
  • 被引用 (Referenced):资产被工作流作为输入消费,但不是由该工作流产生
  • 外部 (External):资产存在于 Prefect 生态系统之外,但被作为依赖项引用

资产生命周期

物化 (Materializations)

当工作流通过创建、更新或覆盖来更改资产时,就会发生 物化 (materialization)。物化通过 @materialize 装饰器声明,它作为一个专门的任务装饰器,用于跟踪资产创建意图。 物化过程基于“物化意图”模型:当运行 @materialize 装饰的函数时,Prefect 会记录该物化尝试。物化的成功或失败由底层任务的执行状态决定。
from prefect.assets import materialize

@materialize("s3://data-lake/processed/customer-data.csv")
def process_customer_data():
    # Asset materialization logic
    pass

引用 (References)

当资产作为上游依赖出现在另一个资产的物化过程中时,就会发生 引用 (reference)。引用会自动从任务执行图中推断出来——当一个物化的输出作为另一个物化的输入时,依赖关系就会被捕获。 引用也可以通过 asset_deps 参数显式声明,这对于建模对外部系统的依赖,或者当仅靠任务图无法完全捕获数据依赖时特别有用。

元数据 (Metadata)

资产定义包含有关该资产的可选元数据。这些资产属性应具有单一事实来源以避免冲突。当您使用属性物化资产时,这些属性将完全覆盖该资产的所有元数据字段。 资产元数据的更新在运行时通过任何指定了元数据字段的工作流进行。

依赖建模

资产依赖关系通过两种互补机制确定: 任务图推断:当物化后的资产通过任务参数流动时,Prefect 会自动构建依赖图。每次物化都充当依赖累积点,汇集所有上游资产并作为下游物化的基础。 显式声明asset_deps 参数允许直接指定资产依赖项,从而能够对任务执行流程中未捕获的关系进行建模。
from prefect.assets import materialize


@materialize(
    "s3://warehouse/enriched-data.csv",
    asset_deps=["postgres://db/reference-tables", "s3://external/vendor-data.csv"]
)
def enrich_data():
    # Explicitly depends on external database and vendor data
    pass
后端将跨工作流边界跟踪这些依赖关系,在您的工作空间内提供资产依赖关系的全局视图。

资产元数据与属性

资产通过 AssetProperties 类支持丰富的元数据,这提供了组织上下文并提高了可发现性。
  • 名称:资产的可读标识符
  • 描述:支持 Markdown 格式的详细文档
  • 所有者:责任方,Prefect 用户和团队在 UI 中有特殊显示处理
  • URL:用于访问或查看资产的网络位置
此外,资产通过 add_asset_metadata() 函数支持动态元数据,允许将行数、处理时间、数据质量指标等运行时信息附加到物化事件中。

资产健康监控

目前,资产健康状况根据其最近一次物化尝试提供数据制品运行状态的视觉指标。
  • 绿色:上次物化成功
  • 红色:上次物化失败
  • 灰色:未记录物化,或资产仅被引用
这种健康模型使数据团队能够以制品为单位快速识别有问题的数据流水线,补充了传统的任务级监控,实现了以数据为中心的可观测性。很快,这些状态将由相应的事件提供支持。

事件发布与集成

资产与 Prefect 的事件系统深度集成,自动发布结构化事件,从而实现下游的自动化和监控。

事件类型

  • 物化事件:这些事件形式如 prefect.asset.materialization.{succeeded|failed},当 @materialize 装饰器引用资产时触发,状态由底层任务执行状态决定。
  • 引用事件:这些事件形式如 prefect.asset.referenced,当物化发生时,无论成功或失败,都会为所有上游资产触发。

事件发布规则

资产事件遵循基于任务执行状态的特定发布模式:
  • 已完成状态:为下游资产发布 prefect.asset.materialization.succeeded,为上游资产发布 prefect.asset.referenced
  • 失败状态:为下游资产发布 prefect.asset.materialization.failed,为上游资产发布 prefect.asset.referenced
  • 缓存状态:不发布资产事件,因为缓存的执行不代表资产状态的新变化
无论物化是否成功,始终会为上游资产发布引用事件,即使下游流程失败,也能实现全面的依赖跟踪。

事件负载

物化事件包含任务执行期间通过 add_asset_metadata() 添加的任何元数据,而引用事件则包含基本的资产识别信息。这支持基于资产状态变化和关联元数据实现丰富的事件驱动自动化。

资产组织与发现

资产根据其 URI 结构在 Prefect UI 中自动组织。
  • 按方案分组:具有相同 URI 方案(例如 s3://, postgres://)的资产会被归为一组
  • 分层组织:URI 路径创建嵌套的组织结构
  • 搜索与过滤:资产元数据支持通过名称、描述和所有权信息进行发现

延伸阅读