在现代数据栈中,有效的数据治理至关重要。Dagster作为领先的数据编排平台,提供了强大的资产元数据和标签功能,帮助团队更好地理解、组织和跟踪数据资产。本文将深入探讨Dagster中的资产元数据和标签功能,展示如何利用这些功能提升数据治理水平。
资产元数据:赋予数据资产"生命"
资产元数据是描述数据资产本身的信息,它使数据资产不再是"黑盒",而是具有丰富上下文的实体。在Dagster中,元数据可以以多种形式附加到资产上,从简单的文本描述到复杂的表格结构。
添加资产所有者:明确责任归属
在大型组织中,明确数据资产的所有权至关重要。Dagster允许通过owners
参数为资产指定所有者,可以是电子邮件地址或团队名称(以team:
前缀标识)。
import dagster as dg
# 使用装饰器添加所有者
@dg.asset(owners=["richard.hendricks@hooli.com", "team:data-eng"])
def my_asset():
...
# 使用AssetSpec添加所有者
my_external_asset = dg.AssetSpec(
"my_external_asset",
owners=["bighead@hooli.com", "team:roof", "team:corpdev"]
)
最佳实践:建议为每个资产至少指定一个所有者,可以是个人或团队。在Dagster+ Pro中,还可以基于资产所有者设置自动警报,当资产出现问题时及时通知相关人员。
使用标签组织资产:构建数据目录
标签是组织资产的强大工具,它们以键值对的形式存在,可以用于搜索、过滤和分类资产。
import dagster as dg
# 使用装饰器添加标签
@dg.asset(tags={"domain": "marketing", "pii": "true"})
def my_asset():
...
# 使用AssetSpec添加标签
my_external_asset = dg.AssetSpec(
"my_external_asset",
tags={"domain": "legal", "sensitive": ""}
)
标签使用技巧:
- 使用一致的命名约定(如全部小写,使用下划线分隔)
- 为常用分类创建标准标签集
- 避免使用空字符串作为值(在UI中会显示为"label"而非键值对)
附加丰富元数据:超越简单描述
Dagster支持附加各种类型的元数据,从简单的链接到复杂的表格结构:
import dagster as dg
@dg.asset(
metadata={
"link_to_docs": dg.MetadataValue.url("https://..."),
"snippet": dg.MetadataValue.md("# Embedded markdown
..."),
})
def my_asset():
...
标准元数据类型:
dagster/uri
: 资产的URI(如"s3://my_bucket/my_object")dagster/column_schema
: 表格资产的列结构dagster/column_lineage
: 列级血缘关系dagster/row_count
: 表格行数dagster/partition_row_count
: 分区行数dagster/table_name
: 表格唯一标识符dagster/code_references
: 源代码引用
表格与列元数据:数据结构的可视化
对于表格资产,Dagster提供了专门的元数据类型来描述其结构。
表格模式元数据
表格模式元数据(dagster/column_schema
)允许定义表格的列结构,包括列名、数据类型和描述。
import dagster as dg
@dg.asset(
deps=["source_bar", "source_baz"],
metadata={
"dagster/column_schema": dg.TableSchema(
columns=[
dg.TableColumn(
"name",
"string",
description="The name of the person",
),
dg.TableColumn(
"age",
"int",
description="The age of the person",
),
]
)
})
def my_asset():
...
运行时模式发现:当模式在运行时才能确定时,可以在MaterializeResult
中返回模式元数据。
列血缘元数据
列血缘元数据(dagster/column_lineage
)跟踪表格列之间的依赖关系,这对于数据溯源和影响分析至关重要。
import dagster as dg
@dg.asset(deps=["source_bar", "source_baz"])
def my_asset():
return dg.MaterializeResult(
metadata={
"dagster/column_lineage": dg.TableColumnLineage(
deps_by_column={
"new_column_foo": [
dg.TableColumnDep(
asset_key=dg.AssetKey("source_bar"),
column_name="column_bar",
),
dg.TableColumnDep(
asset_key=dg.AssetKey("source_baz"),
column_name="column_baz",
),
],
"new_column_qux": [
dg.TableColumnDep(
asset_key=dg.AssetKey("source_bar"),
column_name="column_quuz",
),
],
}
)
}
)
可视化优势:在Dagster+中,列血缘元数据可以直观地展示在资产目录中,支持点击导航查看相关资产。
源代码链接:开发与生产的桥梁
Dagster支持将资产与源代码关联,这一功能目前处于beta阶段,但已显示出巨大潜力。
本地开发中的代码引用
在本地开发环境中,Dagster可以自动附加代码引用:
import dagster as dg
@dg.asset
def my_asset():
...
@dg.asset
def another_asset():
...
defs = dg.Definitions(
assets=dg.with_source_code_references([my_asset, another_asset])
)
生产环境中的代码引用
在生产环境中,Dagster+可以自动将资产与源代码控制系统(如GitHub或GitLab)关联:
from dagster_cloud.metadata.source_code import link_code_references_to_git_if_cloud
import dagster as dg
@dg.asset
def my_asset():
...
@dg.asset
def another_asset():
...
defs = dg.Definitions(
assets=link_code_references_to_git_if_cloud(
assets_defs=dg.with_source_code_references([my_asset, another_asset])
)
)
自定义映射:对于特殊需求,可以手动指定代码引用:
import dagster as dg
@dg.asset(
metadata={
"dagster/code_references": dg.CodeReferencesMetadataValue(
code_references=[
dg.LocalFileCodeReference(
file_path="/path/to/source.yaml",
line_number=1,
label="Model YAML",
)
]
)
})
def my_asset_modeled_in_yaml():
...
实践建议
- 元数据标准化:为团队制定元数据标准,包括必填字段、命名约定和更新流程。
- 渐进式采用:从关键资产开始,逐步扩展元数据覆盖范围。
- 自动化元数据收集:尽可能通过集成自动收集元数据,减少手动工作。
- 定期审查:定期检查元数据的准确性和完整性,确保其反映当前状态。
- 元数据可视化:如果使用Dagster+,充分利用其增强的元数据可视化和管理功能。
结语
Dagster的资产元数据和标签功能为数据治理提供了强大支持。通过合理利用这些功能,团队可以构建更加透明、可追溯和易于管理的数据架构。随着数据资产的增长和复杂性的增加,良好的元数据实践将成为数据团队不可或缺的工具。
无论是小型项目还是企业级数据平台,Dagster的元数据功能都能帮助您更好地理解、组织和跟踪数据资产,最终实现更高效、更可靠的数据运营。