了解 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/
└─ ...
core_project:选择使用 时默认使用的角色和仓库。这是您的主项目(您将部署的项目)。metrics_project:选择使用 时默认使用的角色和仓库。这是要用作本地依赖项的项目。
要在 core_project 内引用 metrics_project,请完成以下步骤:
在
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
现在,您的布局如下所示:
core_project/ ├─ dbt_project.yml ├─ packages.yml ├─ models/ ├─ local_packages/ │ └─ metrics_project/ │ ├─ dbt_project.yml │ ├─ models/ │ └─ ...
在
core_project/packages.yml中,使用相对路径声明本地依赖项。packages: - local: local_packages/metrics_project
在
core_project内,运行dbt deps。dbt 现在会将
metrics_project视为包,metrics_project中的宏可供core_project使用。
编译时自动运行 dbt deps¶
当您部署或更新 dbt 项目对象并为其提供外部访问集成时,Snowflake 可以在编译过程中自动运行 dbt deps,以便在该步骤中安装依赖项。这意味着在部署具有外部依赖关系的项目时,您不再需要将 /dbt_packages 包括在内。
将 dbt 项目对象从工作区部署到 Snowflake 数据库和架构时,您可以创建或更新之前创建的对象。
登录 Snowsight。
在导航菜单中,选择 Projects » Workspaces。
在 Workspaces 菜单中,选择包含 dbt 项目的工作区。
在工作区编辑器的右侧,选择 Connect » Deploy dbt project。
在 Deploy dbt project 弹出窗口中,选择以下内容:
在 Select location 下,选择您的数据库和架构。
在 Select or Create dbt project 下,选择 Create dbt project。
输入名称和描述。
(可选)输入默认目标,以选择将哪个配置文件用于编译和后续运行(例如 prod)。在
ARGS中,dbt 项目运行的目标仍可替换为--target。(可选)选择 Run dbt deps,然后选择外部访问集成以在部署期间自动执行
dbt deps。
选择 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);
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 项目对象的计划(任务)列表,并可选择在对象资源管理器中查看任务详细信息。
要在编译期间自动运行 dbt deps,请运行带 EXTERNAL_ACCESS_INTEGRATIONS 参数的 CREATE DBT PROJECT 或 ALTER DBT PROJECT 命令,如以下示例所示。
您可以将空数组传递到 EXTERNAL_ACCESS_INTEGRATIONS 参数,或者您可以指定一个或多个外部访问集成,具体取决于您的用例。本地依赖项不需要外部访问集成,但如果您需要混合使用本地包和远程包(例如,来自 dbt Packages hub 或 Git),则必须配置真正的外部访问集成。
-- Create a dbt project object that runs dbt deps on compile for remote packages
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);
-- Create a dbt project object that runs dbt deps on compile for only local dependencies
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 = ();
-- Update the Git repository object to fetch the latest code
ALTER GIT REPOSITORY mydb.dev_schema.my_dbt_git_stage FETCH;
-- Set external access integrations
ALTER DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
SET EXTERNAL_ACCESS_INTEGRATIONS = ();
-- Add a new version to the dbt project object based on the updated Git repository object
-- After an external access integration is set, the next ALTER DBT PROJECT ... ADD VERSION will call dbt deps during compile
ALTER DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
ADD VERSION
FROM '@mydb.dev_schema.my_dbt_git_stage/branches/main/sales_dbt_project';
To automatically run dbt deps during compile, run the snow dbt deploy
command with either the --external-access-integration or --install-local-deps flag, as shown in the following example.
--install-local-deps 标志创建了一个具有空外部访问集成的对象。在常规编译中,它会运行 dbt deps 并替换 dbt_packages 文件夹的先前状态。
The --external-access-integration flag adds an external access integration, which taken precedence over the
--install-local-deps flag.
snow dbt deploy my_dbt_project --install-local-deps;
在 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;
有关 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,以打包所有依赖项和项目文件。