Snowflake 上的 dbt 项目

dbt Core (https://github.com/dbt-labs/dbt-core) 是一个开源数据转换工具和框架,可用于定义、测试和部署 SQL 转换。借助 dbt Projects on Snowflake,您可以使用熟悉的 Snowflake 功能来创建、编辑、测试、运行和管理您的 dbt Core 项目。dbt 项目 是一个目录,其中包含一个 dbt_project.yml 文件和一组定义 dbt 资产(例如模型和来源)的文件。

您可以在 Snowsight 中使用 工作区 来处理 dbt 项目文件和目录,然后将项目部署为架构级 DBT PROJECT 对象。您还可以使用 SQL 来处理 dbt 项目对象、使用 Snowflake CLI 命令 将部署和执行集成到您的 CI/CD 工作流程、使用 任务 来计划和编排 dbt 项目运行,以及使用 Snowflake 监控工具 检查、管理和调整项目运行。

将工作区用于 dbt Projects on Snowflake

Snowsight 中的工作区为 dbt 项目提供基于 Web 的集成开发环境 (IDE),该环境可以连接并同步到 Git 存储库。dbt Projects on Snowflake 的每个工作区可以代表单个 dbt 项目或多个 dbt 项目,具体取决于您组织文件和文件夹的方式。

您可以使用 dbt Projects on Snowflake 的工作区直接在 Snowflake 中可视化、测试和运行 dbt 项目。您还可以将工作区连接到 Snowflake 中的 dbt 项目对象,这样您就可以从工作区创建和更新对象。工作区还提供了一种快速初始化(或构建)新 dbt 项目的方法,该方法会为 dbt 项目创建必要的文件和目录,包括 dbt_project.yml 文件。

除了支持 dbt 项目外,工作区还提供统一的编辑器供您创建、组织和管理 Snowflake 中多种文件类型和项目的代码。有关更多信息,请参阅 工作区

了解 dbt 项目对象

DBT PROJECT 是一个架构级别的对象,它包含 Snowflake 中 dbt 项目的版本控制源文件。您可以将 dbt 项目对象连接到工作区,也可以独立于工作区创建和管理对象。

您可以像 Snowflake 中的其他架构级对象一样 CREATE、ALTER 和 DROP dbt 项目对象。dbt 项目对象还支持基于角色的访问控制 (RBAC)。您可以从 Snowflake 仓库中使用 EXECUTE DBT PROJECT 命令来运行 dbt 命令(如 testrun)。您也可以使用 任务 来计划这些命令的执行。

dbt 项目对象通常基于包含 dbt-project.yml 文件的 dbt 项目目录。这是当您从工作区中部署(创建)dbt 项目对象时 Snowflake 使用的模式。

您也可以选择从父目录(其子目录包含多个 dbt 项目)创建 dbt 项目。当您以这种方式创建 dbt 项目对象时,必须在与项目结合使用的任何 EXECUTE DBT PROJECT 命令中使用 PROJECT_ROOT 参数。此参数指定包含项目 dbt_project.yml 文件的子目录的路径。

dbt 项目对象的 CI/CD 工作流程

dbt 项目对象支持一些可用于从命令行创建和管理 dbt 项目的 Snowflake CLI 命令。这对于将 dbt 项目集成到您的数据工程工作流程和 CI/CD 管道中很有用。有关更多信息,请参阅 Snowflake CLI将 CI/CD 集成到 Snowflake CLI 中snow dbt 命令

dbt 项目对象和文件的版本控制

Snowflake 维护 dbt 项目对象的版本及其相应的项目文件。您可以在整个数据开发和部署生命周期中使用此版本控制来跟踪和管理更改。Snowflake 通过以下示例所示的方式识别 dbt 项目暂存区中的 dbt 项目对象版本:

snow://dbt/my_db.my_schema.my_dbt_project_object/versions/version_id

version_id 可以是以下任一标识符:

  • VERSION$<num> – 以 VERSION$<num> 的形式指定版本标识符,其中 <num> is a positive integer, for example, VERSION$1

    当您创建 dbt 项目对象时,版本号从 1 开始,并随着 dbt 项目对象的每个新版本递增一。

    当您执行以下任务时,Snowflake 会递增版本标识符:

    • 从工作区中 :ui:`Redeploy dbt project`(运行 ALTER 命令)。

    • 通过使用 ALTER DBT PROJECT 命令更新项目。

    • 在不使用 --force 选项的情况下运行 Snow CLI snow dbt deploy 命令。

    当您运行以下命令时,Snowflake 会将版本标识符重置为 1 并移除所有版本别名:

    • 在 SQL 中,带 OR REPLACE 选项 CREATE DBT PROJECT 命令。

    • 在 Snowflake CLI 中,带 --force 选项的 snow dbt deploy 命令。

  • LAST – 表示 dbt 项目对象的最新版本。

  • FIRST – 表示 dbt 项目对象的最早版本。

  • version_name_alias – 表示您已使用带 ADD VERSION 选项的 ALTER DBT PROJECT 命令为特定版本的 dbt 项目对象创建的自定义版本名称别名。版本名称别名始终映射到特定的版本标识符,例如 VERSION$3

Project files stored in the dbt project stage are organized by version, with each version having its own subdirectory. For example, a dbt project object named my_dbt_project_object with a version identifier of VERSION$3 and a dbt project file named dbt_project.yml can be referenced as shown in the following example:

snow://dbt/my_db.my_schema/my_dbt_project_object/versions/VERSION$3/dbt_project.yml

要求、注意事项和限制

在使用 dbt Projects on Snowflake 之前,请查看本节中的要求、注意事项和限制。

dbt 项目

以下要求、注意事项和限制适用于 dbt Projects on Snowflake 支持的 dbt 项目配置:

  • 仅支持 dbt Core 项目。不支持 dbt Cloud 项目。dbt Projects on Snowflake 运行 dbt-core 版本 1.9.4 和 dbt-snowflake 版本 1.9.2。当您将现有的 dbt 项目迁移到 Snowflake 时,您的 dbt 版本不必与 Snowflake 版本保持一致。

  • Snowflake 工作区中的每个 dbt 项目文件夹都必须包含一个 profiles.yml 文件,该文件在 Snowflake 中为该项目指定目标 warehousedatabaseschemarole。必须将 type 设置为 snowflake。dbt 需要一个 account 和:code:user,但这些可以留空或是任意字符串,因为 dbt 项目在 Snowflake 中的当前账户和用户上下文下运行。

  • 工作区中的 dbt 项目的文件夹结构中不能包含超过 20,000 个文件。此限制包括 dbt 项目目录和子目录中的所有文件,包括 target/dbt_packages/logs 目录,当从工作区中运行 dbt 项目时,日志文件会保存在这些目录中。

存储过程

当您使用存储过程来调用 EXECUTE DBT PROJECT 时,使用调用方权限存储过程。有关更多信息,请参阅 CREATE PROCEDURE创建存储过程

dbt Projects on Snowflake 的工作区

以下要求、注意事项和限制适用于 dbt Projects on Snowflake 的工作区:

个人数据库要求

Workspaces are created within a personal database and cannot be shared with other users. Personal databases must be enabled at the account level, which requires ACCOUNTADMIN privileges. For more information, see Manage access and behavior.

Git 存储库

For requirements, considerations, and limitations that apply when you connect a workspace for dbt Projects on Snowflake to a Git repository, see Snowflake 中的 Git 限制.

通过 PrivateLink 访问的 Git 存储库必须事先配置。有关更多信息,请参阅 配置 Snowflake 以通过公共网络进行访问

dbt 依赖关系

以下要求、注意事项和限制适用于 dbt Projects on Snowflake 中 dbt 项目的 dbt 依赖关系:

  • You must execute the dbt deps command within a Snowflake workspace to populate the dbt_packages folder for your dbt Project. Alternatively, you can run dbt deps on your local machine and deploy with snow dbt deploy.

    A dbt Project object is a versioned snapshot, so running dbt deps with EXECUTE DBT PROJECT or snow dbt execute doesn’t modify any files; it mainly checks that your external access is configured correctly.

  • You can specify public Git packages (https://docs.getdbt.com/docs/build/packages#git-packages) in the packages.yml file, however private git packages aren't supported.

  • 要允许 Snowflake 访问依赖关系的存储库,需要网络规则和外部访问集成。有关更多信息,请参阅 在 Snowflake 中为 dbt 依赖关系创建外部访问集成。有关外部网络访问限制的更多信息,请参阅 外部网络访问限制

遥测、日志记录和跟踪

以下要求、注意事项和限制适用于 Snowflake 上针对 dbt 的遥测、日志记录和跟踪:

  • dbt Projects on Snowflake 的工作区不能动态流式传输标准输出,并且标准输出只能在命令完成时查看。

  • 查看日志和跟踪需要在 dbt 项目对象上设置 LOG_LEVEL 和 TRACE_LEVEL。有关更多信息,请参阅 Snowflake 上 dbt 项目的访问控制在 Snowflake 上监控 dbt 项目

  • 默认情况下,Snowflake 会在默认 SNOWFLAKE TELEMETRY.EVENTS 表中收集遥测数据。如果您有设置为账户事件表的自定义事件表,则会在那里收集遥测数据。如果您使用 Enterprise Edition 账户,则可以创建事件表来收集遥测数据,并将其与在其中部署 dbt 项目对象的数据库关联。有关更多信息,请参阅 事件表概述

支持的 dbt 命令

下表显示了 dbt Projects on Snowflake 中支持的 dbt 命令。不支持此处未列出的任何 dbt 命令 (https://docs.getdbt.com/reference/dbt-commands)。

dbt Projects on Snowflake,通过执行方法支持 dbt 命令

dbt 命令

工作区

EXECUTE DBT PROJECT

snow dbt execute (CLI)

build (https://docs.getdbt.com/reference/commands/build)

compile (https://docs.getdbt.com/reference/commands/compile)

deps (https://docs.getdbt.com/reference/commands/deps) [1]

list (https://docs.getdbt.com/reference/commands/list)

parse (https://docs.getdbt.com/reference/commands/parse)

run (https://docs.getdbt.com/reference/commands/run)

retry (https://docs.getdbt.com/reference/commands/retry)

run-operation (https://docs.getdbt.com/reference/commands/run-operation)

seed (https://docs.getdbt.com/reference/commands/seed)

show (https://docs.getdbt.com/reference/commands/show)

snapshot (https://docs.getdbt.com/reference/commands/snapshot)

test (https://docs.getdbt.com/reference/commands/test)

[1] A dbt Project object is a versioned snapshot of your project. Running the deps command on it doesn't modify any files; it’s primarily used to verify that your external access configuration is correct. When a dbt Project object is created with an external access integration, dbt deps is run before dbt compile to package all dependencies and project files.

语言: 中文