核心概念
资产从根本上由其 key(键) 定义,这是一个唯一标识资产的 URI,通常指定资产所在的外部存储系统。资产键既是标识符又是组织结构——资产会根据其 URI 方案(例如s3://, postgres://, snowflake://)自动分组,并可根据其路径结构进行分层组织。 资产在 Prefect 中主要存在三种状态:- 物化 (Materialized):资产已被 Prefect 工作流创建、更新或覆盖
- 被引用 (Referenced):资产被工作流作为输入消费,但不是由该工作流产生
- 外部 (External):资产存在于 Prefect 生态系统之外,但被作为依赖项引用
资产生命周期
物化 (Materializations)
当工作流通过创建、更新或覆盖来更改资产时,就会发生 物化 (materialization)。物化通过@materialize 装饰器声明,它作为一个专门的任务装饰器,用于跟踪资产创建意图。 物化过程基于“物化意图”模型:当运行 @materialize 装饰的函数时,Prefect 会记录该物化尝试。物化的成功或失败由底层任务的执行状态决定。引用 (References)
当资产作为上游依赖出现在另一个资产的物化过程中时,就会发生 引用 (reference)。引用会自动从任务执行图中推断出来——当一个物化的输出作为另一个物化的输入时,依赖关系就会被捕获。 引用也可以通过asset_deps 参数显式声明,这对于建模对外部系统的依赖,或者当仅靠任务图无法完全捕获数据依赖时特别有用。元数据 (Metadata)
资产定义包含有关该资产的可选元数据。这些资产属性应具有单一事实来源以避免冲突。当您使用属性物化资产时,这些属性将完全覆盖该资产的所有元数据字段。 资产元数据的更新在运行时通过任何指定了元数据字段的工作流进行。依赖建模
资产依赖关系通过两种互补机制确定: 任务图推断:当物化后的资产通过任务参数流动时,Prefect 会自动构建依赖图。每次物化都充当依赖累积点,汇集所有上游资产并作为下游物化的基础。 显式声明:asset_deps 参数允许直接指定资产依赖项,从而能够对任务执行流程中未捕获的关系进行建模。资产元数据与属性
资产通过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 路径创建嵌套的组织结构
- 搜索与过滤:资产元数据支持通过名称、描述和所有权信息进行发现