了解 Snowflake 上 dbt 项目的依赖项

在 dbt Projects on Snowflake 中,dbt 依赖项是您在 packages.yml 文件中声明的包(例如,入门教程 中的 dbt-labs/dbt_utils)。运行 dbt deps 时,这些依赖项被安装到 dbt_packages 文件夹中,就像在 dbt Core 中一样。

您必须执行 Snowflake 工作区中的 dbt deps 命令才能填充 dbt 项目的 dbt_packages 文件夹。或者,您可以在本地计算机或 git orchestrator 上运行 dbt deps`(例如,GitHubActions)并通过 :code:`snow dbt deploy 进行部署。

创建 dbt 项目版本后,请将其视为只读代码。您不能使用 dbt deps 修改其文件;如果需要更新的依赖项,请创建新版本。

关于执行 dbt deps 命令

您可以通过以下方式之一执行 dbt deps 命令:

  • **在 Snowflake 工作区中:**(建议用于开发环境。)在将 dbt 项目部署为 DBT PROJECT 对象之前,您可以在 Snowsight 中的工作区内执行 dbt deps 命令来填充 dbt_packages

    这需要外部网络访问权限,以便 Snowflake 可以访问依赖项的存储库。有关更多信息,请参阅 在 Snowflake 中为 dbt 依赖关系创建外部访问集成

  • **在 Snowflake 之外:**(例如,在部署管道的构建步骤中。)您可以在本地计算机上或持续集成 (CI) 中执行 dbt deps 命令,将包下载到 dbt_packages,然后将整个项目(包括该文件夹)部署到 Snowflake 中。

    这不需要外部网络访问集成,因为所有依赖项都已包含在 dbt 项目中。

    由于 dbt 项目版本中的文件是不可变的,因此,如果尝试对已部署的对象执行 dbt deps,这不会影响对象内的 dbt_packages 文件夹。

跨 dbt 项目依赖项

为了在 dbt 项目中引用另一个 dbt 项目,必须将被引用的 dbt 项目复制到 dbt 项目的根目录中。

尽管本地依赖项不需要外部访问集成,但如果您需要混合使用本地包和远程包(例如,来自 dbt Packages hub 或 Git),则必须配置真正的外部访问集成。

以下面的两个 dbt 项目为例。您希望 core_project 在本地包含 metrics_project,以便在部署到 Snowflake 时所有内容都是独立的(无需外部访问)。

/Projects
├─ core_project/
│   ├─ dbt_project.yml
│   ├─ packages.yml
│   ├─ models/
│   └─ ...
└─ metrics_project/
    ├─ dbt_project.yml
    ├─ models/
    └─ ...
Copy
  • core_project:选择使用 时默认使用的角色和仓库。这是您的主项目(您将部署的项目)。

  • metrics_project:选择使用 时默认使用的角色和仓库。这是要用作本地依赖项的项目。

要在 core_project 内引用 metrics_project,请完成以下步骤:

  1. core_project 内,创建一个名为 local_packages 的文件夹。将 metrics_project 复制到此文件夹。

    请确保 metrics_project 在其 dbt_project.yml 中的名称与 core_project 不同。它们必须是唯一的。

    cd /Projects/core_project
    mkdir local_packages
    cp -R ../metrics_project ./local_packages/metrics_project
    
    Copy

    现在,您的布局如下所示:

    core_project/
      ├─ dbt_project.yml
      ├─ packages.yml
      ├─ models/
      ├─ local_packages/
      │   └─ metrics_project/
      │       ├─ dbt_project.yml
      │       ├─ models/
      │       └─ ...
    
    Copy
  2. core_project/packages.yml 中,使用相对路径声明本地依赖项。

    packages:
      - local: local_packages/metrics_project
    
    Copy
  3. core_project 内,运行 dbt deps

    dbt 现在会将 metrics_project 视为包,metrics_project 中的宏可供 core_project 使用。

编译时自动运行 dbt deps

当您部署或更新 dbt 项目对象并为其提供外部访问集成时,Snowflake 可以在编译过程中自动运行 dbt deps,以便在该步骤中安装依赖项。这意味着在部署具有外部依赖关系的项目时,您不再需要将 /dbt_packages 包括在内。

将 dbt 项目对象从工作区部署到 Snowflake 数据库和架构时,您可以创建或更新之前创建的对象。

  1. 登录 Snowsight

  2. 在导航菜单中,选择 Projects » Workspaces

  3. Workspaces 菜单中,选择包含 dbt 项目的工作区。

  4. 在工作区编辑器的右侧,选择 Connect » Deploy dbt project

  5. Deploy dbt project 弹出窗口中,选择以下内容:

    • Select location 下,选择您的数据库和架构。

    • Select or Create dbt project 下,选择 Create dbt project

    • 输入名称和描述。

    • (可选)输入默认目标,以选择将哪个配置文件用于编译和后续运行(例如 prod)。在 ARGS 中,dbt 项目运行的目标仍可替换为 --target

    • (可选)选择 Run dbt deps,然后选择外部访问集成以在部署期间自动执行 dbt deps

  6. 选择 Deploy

Output 选项卡显示在 Snowflake 上运行的命令,类似于以下示例:

CREATE DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
  FROM 'snow://workspace/mydb.my_dbt_projects_schema.sales_model/versions/version$2'
  EXTERNAL_ACCESS_INTEGRATIONS = (my_dbt_ext_access);
Copy
my_dbt_project successfully created.

现在,Connect 菜单会显示您创建的 dbt 项目对象的名称,其中包含以下选项:

  • Redeploy dbt project:选择使用 时默认使用的角色和仓库。使用 ALTER,将 dbt 项目对象更新为项目的当前工作区版本。这会使 dbt 项目对象的版本增加一。有关更多信息,请参阅 dbt 项目对象和文件的版本控制

  • Disconnect:选择使用 时默认使用的角色和仓库。断开工作区与 dbt 项目对象的连接,但不删除 dbt 项目对象。

  • Edit project:选择使用 时默认使用的角色和仓库。更新 dbt 项目对象的注释、默认目标和外部访问集成。

  • View project:选择使用 时默认使用的角色和仓库。在对象资源管理器中打开 dbt 项目对象,可以在其中查看 dbt 项目对象的 CREATE DBT PROJECT 命令和项目的运行历史记录。

  • Create schedule:选择使用 时默认使用的角色和仓库。为您提供创建按计划运行 dbt 项目对象的任务的选项。有关更多信息,请参阅 创建任务来计划 dbt 项目的执行

  • View schedules:选择使用 时默认使用的角色和仓库。打开运行 dbt 项目对象的计划(任务)列表,并可选择在对象资源管理器中查看任务详细信息。

在 Snowflake 中为 dbt 依赖关系创建外部访问集成

当您在工作区中运行 dbt 命令时,dbt 可能需要远程访问 URLs 才能下载依赖关系。例如,dbt 可能需要从 dbt 包中心或从 GitHub 中下载包。

大多数 dbt 项目在其 packages.yml 文件中指定依赖关系。必须在 dbt 项目工作区中安装这些依赖关系。

您无法使用依赖关系更新已部署的 dbt 项目对象。要使用新的依赖项更新 dbt 项目对象,必须向该对象中添加新版本。有关更多信息,请参阅 dbt 项目对象如何更新

要从远程 URLs 获取 dbt 包,Snowflake 需要依赖于网络规则的外部访问集成,如以下示例所示:

-- Create NETWORK RULE for external access integration

CREATE OR REPLACE NETWORK RULE my_dbt_network_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  -- Minimal URL allowlist that is required for dbt deps
  VALUE_LIST = (
    'hub.getdbt.com',
    'codeload.github.com'
    );

-- Create EXTERNAL ACCESS INTEGRATION for dbt access to external dbt package locations

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_dbt_ext_access
  ALLOWED_NETWORK_RULES = (my_dbt_network_rule)
  ENABLED = TRUE;
Copy

有关 Snowflake 中外部访问集成的更多信息,请参阅 创建和使用外部访问集成

dbt 依赖项的限制、要求和注意事项

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

  • 您必须执行 Snowflake 工作区中的 dbt deps 命令才能填充 dbt 项目的 dbt_packages 文件夹。或者,您可以在本地计算机或 Git orchestrator 上运行 dbt deps 并通过 snow dbt deploy 进行部署。

    dbt 项目对象是版本化快照,因此运行 dbt deps 与 EXECUTE DBT PROJECT 或 snow dbt 执行 不修改任何文件;它主要检查外部访问配置是否正确。

  • 您可以在 packages.yml 文件中指定公共 Git 包 (https://docs.getdbt.com/docs/build/packages#git-packages),但不支持私有 Git 包。

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

  • dbt 项目对象是项目的版本化快照。对其运行 deps 命令不会修改任何文件;它主要用于验证外部访问配置是否正确。使用外部访问集成创建 dbt 项目对象时,在 dbt compile 之前运行 dbt deps,以打包所有依赖项和项目文件。

语言: 中文