外部沿袭

外部沿袭扩展了 Snowflake 的 原生沿袭,以涵盖外部数据源和目标,使您能够了解整个数据生态系统中的数据流。它从外部 ETL 工具和源数据库捕获沿袭信息,以创建数据在数据管道中流动的统一视图。

OpenLineage (https://openlineage.io) 是一种开放标准,用于跨各种数据工具和平台捕获和共享数据沿袭信息。Snowflake 利用该框架,通过 REST 端点接收 OpenLineage 兼容事件。dbt 和 Apache Airflow 等外部工具可以使用该端点将沿袭元数据发送到 Snowflake,Snowflake 随后将这些信息整合到 Snowsight 中显示的原生沿袭图中。

外部沿袭 REST 端点
/api/v2/lineage/external-lineage
Copy
Snowflake 基础 URL 用于 REST 端点
https://<account_identifier>.snowflakecomputing.cn
Copy

其中 account-identifier 是您 Snowflake 账户的 账户标识符。您可以使用账户名称格式或账户定位器格式作为账户标识符。

例如,如果您的账户标识符是 myorg-dev_account,则外部沿袭端点的基础 URL 为:https://myorg-dev_account.snowflakecomputing.cn

外部沿袭工作流程

为数据工具实施外部沿袭包括以下任务:

  1. 为正在对外部沿袭端点进行身份验证的用户 授予必要的权限

  2. 配置您的数据工具,以向 Snowflake REST 端点发送 OpenLineage 事件。

  3. 选择适用于 Snowflake REST APIs 的身份验证方法,然后配置您的数据工具使用该方法对外部沿袭端点的请求进行身份验证。

  4. 照常使用您的数据工具。OpenLineage 事件会自动发送到 Snowflake,并显示在 Snowsight 的原生沿袭图中。

如果您想在配置数据工具以发出 OpenLineage 事件之前测试外部沿袭端点,请参阅 发送手动请求以建立沿袭

查看数据沿袭

在 Snowsight 中查看数据沿袭,请完成以下步骤:

  1. 使用 |sf-web-interface-link|必要权限 :ref:`<label-lineage_privileges> 登录到 `

  2. 在导航菜单中,选择 Catalog » Database Explorer,然后选择 支持的对象,例如表或视图。

  3. 选择 Lineage 选项卡。

当数据工具向 Snowflake 发送沿袭信息时,外部对象会出现在 Snowsight 沿袭图中,并标记为外部节点。例如:

具有外部对象的 Snowsight 沿袭图

您可以选择外部对象或连接对象的线以获取更多信息,就像操作原生沿袭一样。

授予 Snowflake 权限

在 REST 请求 经过身份验证 后,Snowflake 会检查与该请求关联的用户是否有权使用外部沿袭。与请求关联的用户必须拥有被授予账户 INGEST LINEAGE 权限的角色。

例如,假设您希望服务用户 dbt_integration_user 发送的请求显示在 Snowsight 沿袭中。作为管理员,运行以下命令以创建专用角色,授予其必要权限,然后将该角色分配给用户:

CREATE ROLE dbt_lineage_role;
GRANT INGEST LINEAGE ON ACCOUNT TO ROLE dbt_lineage_role;
GRANT ROLE dbt_lineage_role TO USER dbt_integration_user;
Copy

配置数据工具

备注

任何具有 OpenLineage 集成的数据工具都可以配置为向 Snowflake 发送沿袭数据。有关具有集成的工具完整列表,请参阅 OpenLineage 集成 (https://github.com/OpenLineage/OpenLineage/tree/main/integration#openlineage-integrations)。

以下部分提供将外部沿袭与 dbt 和 Apache AirFlow 一起使用的基本说明。

配置 dbt 将沿袭数据发送到 Snowflake

备注

配置 dbt 以发出 OpenLineage 事件并非 Snowflake 独有;Snowflake 唯一特定的部分是外部沿袭的端点和基础 URL。

以下步骤提供设置 dbt 环境所需的最小配置。请参阅 OpenLineage dbt 文档 (https://openlineage.io/apidocs/openapi/) 和 OpenLineage 规范 (https://openlineage.io/docs/integrations/dbt),以配置您的 OpenLineage-dbt 集成。

  1. 安装 OpenLineage-dbt 集成 (https://pypi.org/project/openlineage-dbt/):

    pip3 install openlineage-dbt
    
    Copy
  2. 设置传输变量以指定外部沿袭的 基础 URL端点安全令牌

    例如,如果您的账户标识符是 MYORG-DEV_ACCOUNT,则在您的 YAML 配置文件中定义以下代码:

    transport:
       type: http
       url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.cn
       endpoint: /api/v2/lineage/external-lineage
       auth:
          type: api_key
          apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
       compression: gzip
    
    Copy
  3. 替换 dbt 命令为 dbt-ol。例如,将 dbt run 命令更改为 dbt-ol run

    这些 dbt-ol 命令是 OpenLineage-dbt 集成所必需的,并非 Snowflake 独有。

有关 OpenLineage-dbt 集成的更多信息,包括设置变量的其他方法,请参阅 OpenLineage dbt 文档 (https://openlineage.io/docs/integrations/dbt)。

配置 Airflow,将沿袭数据发送到 Snowflake

备注

配置 Apache Airflow 以发出 OpenLineage 事件并非 Snowflake 独有;Snowflake 唯一特定的是外部沿袭的端点和基础 URL。

以下步骤提供了设置 Airflow 环境所需的最低配置,适用于 Airflow 版本 2.7+,这是 OpenLineage 推荐使用的版本。请参阅 OpenLineage Airflow 文档 (https://openlineage.io/apidocs/openapi/) 以及 OpenLineage 规范 (https://openlineage.io/docs/integrations/airflow),以配置您的 OpenLineage-Airflow 集成。

  1. 为版本 2.7+ 安装 OpenLineage Airflow 集成 (https://airflow.apache.org/docs/apache-airflow-providers-openlineage/stable/index.html#apache-airflow-providers-openlineage):

    pip install apache-airflow-providers-openlineage
    
    Copy

    如果您使用的是旧版本 Airflow,请改为安装 openlineage-airflow

  2. 设置传输变量以指定外部沿袭的 基础 URL端点安全令牌

    例如,如果您的账户标识符是 MYORG-DEV_ACCOUNT,则在您的 YAML 配置文件中定义以下代码:

    transport:
       type: http
       url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.cn
       endpoint: /api/v2/lineage/external-lineage
       auth:
          type: api_key
          apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
       compression: gzip
    
    Copy

有关 OpenLineage-Airflow 集成的更多信息,包括设置变量的其他方法,请参阅 OpenLineage Airflow 文档 (https://openlineage.io/docs/integrations/airflow)。

选择身份验证方法

Snowflake 提供多种方式对 Snowflake REST 端点(如外部沿袭使用的端点)进行请求身份验证。有关完整的身份验证方法列表,请参阅 使用 Snowflake 对 Snowflake REST APIs 进行身份验证

选择首选身份验证方法后,必须为特定用户生成安全令牌。该令牌用于将用户与 REST 请求关联,以便 Snowflake 可以对用户进行身份验证,并验证用户是否 被授权使用外部沿袭

在 Snowflake 中成功将用户与安全令牌关联后,需要配置数据工具,以使用该令牌对请求进行身份验证。例如,如果您使用 YAML 配置文件设置 OpenLineage 传输变量,请使用以下代码指定在请求头中发送的安全令牌:

transport:
   auth:
      type: api_key
      apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
Copy

有关指定安全令牌的其他方法,请参阅 OpenLineage 数据工具文档。

发送手动请求以建立沿袭

外部沿袭通过接受符合 OpenLineage 规范的 COMPLETE 事件 JSON 有效负载来工作。与数据工具集成时,该工具会发出这些 COMPLETE 事件。但您也可以构造一个 COMPLETE 事件,然后使用任何可以向端点发送 POST 请求的工具或语言将其发送到端点。

有效请求由以下方法组成::ref:` 基础 URL<label-external_lineage_base_url>` 和 :ref:` 端点 <label-external_lineage_endpoint>`:

POST https://<account_identifier>.snowflakecomputing.cn/api/v2/lineage/external-lineage
Copy

其中 account_identifier 是您 Snowflake 账户的 账户标识符

以下示例展示如何使用 curl 将沿袭信息发送到外部沿袭:

curl -i -X POST \
 -H "Content-Type: application/json" \
 -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLsecuritytoken..." \
 -H "Accept: application/json" \
 -H "User-Agent: myApplicationName/1.0" \
 -H "X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT" \
 -d "@request_body.json" \
 "https://MYORG-DEV_ACCOUNT.snowflakecomputing.cn/api/v2/lineage/external-lineage"
Copy

其中 request_body.json 符合 OpenLineage 规范中关于 COMPLETE 事件的定义。有关该 JSON 有效负载的更多信息,请参阅 有效负载要求

手动请求的身份验证和授权

发送到外部沿袭端点的手动请求的身份验证和授权与从数据工具发送的请求相同。

有效负载要求

当您在向外部沿袭端点发出手动请求时发送 JSON 有效负载,该有效负载必须满足以下要求:

  • 必须符合 OpenLineage 规范 (https://openlineage.io/apidocs/openapi/)。

  • 必须是 COMPLETE 事件。也就是说,eventType 属性必须为 COMPLETE。其他类型的事件将被忽略。

  • inputs 属性和 outputs 属性必须是 Snowflake 与外部对象的混合。不能使用外部沿袭在两个外部对象之间或两个 Snowflake 对象之间建立沿袭。如果两个属性都指定相同类型的对象(Snowflake 或外部),请求将返回 404 HTTP 状态码。

  • 必须包含以下属性:

    • inputs

    • outputs

    • eventType

    • eventTime

    • job

    您可以选择包含 run 属性,这对于识别作业很有用。有效负载可以包含其他属性,但 Snowflake 会忽略它们。

最小有效负载示例

以下示例展示可发送到外部沿袭端点的最小有效负载:

{
   "eventType": "COMPLETE",
   "eventTime": "2025-03-12T06:51:12.000Z",
   "job": {"namespace": "exampleNamespace", "name": "exampleJob"},
   "run": {"runId": "123e4567-e89b-12d3-a456-426614174000"},
   "producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
   "schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
   "inputs": [{"namespace": "snowflake://AXORG-AX_TEST_PP8", "name": "OL_TEST.OL_TEST_SCH.TEST_DEMO"}],
   "outputs": [{"namespace": "postgres://localhost:5432", "name": "PDB.SCH.OUTPUT"}]
}
Copy

指定对象类型

outputs 数组中,您可以使用 facets 字段指定对象类型,可以是任意用户定义的字符串。例如,以下有效负载片段指定对象类型为 VIEW:

"outputs": [
    {
        "namespace": "postgres://db.company.com:5432",
        "name": "db.schema.view",
        "facets": {"datasetType": {"datasetType": "VIEW"}},
    },
],
Copy

如果未指定 facets 字段,对象类型默认为 External Node

指定多个输入

如果有效负载包含多个输入,则生成的沿袭显示输出为两个输入的下游对象。例如,如果有效负载有输入 A 和 B,以及输出 C,则沿袭显示 A-C 和 B-C。

发送移除沿袭的请求

您可以发送 DELETE 请求到外部沿袭端点,以移除在 Snowflake 对象与外部对象之间建立的沿袭。

  • 要中断源对象与目标对象之间的沿袭,请使用 URL 查询参数指定两个对象的详细信息。

  • 要中断对象与其所有下游对象之间的沿袭,请只指定源对象,而不指定目标对象。

  • 要从沿袭图中移除目标对象(无论其上游有多少个对象),请指定目标对象而不指定源对象。

移除沿袭的有效请求由以下方法组成::ref:` 基础 URL <label-external_lineage_base_url>` 和 端点

DELETE https://<account_identifier>.snowflakecomputing.cn/api/v2/lineage/external-lineage
Copy

查询参数

描述

sourceNamespace={namespace}

源数据集的命名空间。

sourceName={FQN}

源数据集的完全限定名称。

sourceDatasetType={dataset type}

源数据集的类型(例如,TABLE、VIEW、DATASET)。默认情况下,该值应为 External node。如果在发送建立沿袭请求时,在有效负载的 facets 字段中提供了值,请指定您在有效负载中发送的值,而非 External node。

targetNamespace={namespace}

目标数据集命名空间。

targetName={FQN}

目标数据集完全限定名称。

targetDatasetType={dataset type}

Type of the target dataset (for example, TABLE, VIEW, DATASET). By default, the value should be External Node (External%20Node). If you provided a value in the facets field of the payload when you sent a request to establish lineage, then specify the value that you sent in the payload, not External node.

备注

查询参数的值区分大小写。

用于移除沿袭的访问控制

发送请求以移除对象之间沿袭的用户必须具有 DELETE LINEAGE 账户权限。

限制和注意事项

  • Snowflake 对象必须是 COMPLETE 事件的 INPUT 或 OUTPUT。也就是说,当输入数据和输出数据都不是 Snowflake 对象时,外部沿袭不会接收沿袭事件。

  • Snowflake doesn't support OpenLineage version 2.

  • 外部沿袭事件的保留期为一年。

  • Snowflake 仅识别 COMPLETE 沿袭事件。数据工具发出的所有其他事件都将被忽略。

  • 来自外部源的沿袭不会出现在 GET_LINEAGE 函数的输出中。

  • 外部沿袭不支持列级沿袭。

  • 数据集的完全限定名称(即输入或输出)不能超过 1000 个字符。

  • 同一账户中不能存储超过 10,000 个事件。如果达到此限制,必须先删除事件,然后才能添加新事件。

语言: 中文