Snowflake:有没有不使用就可以创建仓库的方法?

Posted

技术标签:

【中文标题】Snowflake:有没有不使用就可以创建仓库的方法?【英文标题】:Snowflake: Is there a way to create a warehouse without using it? 【发布时间】:2021-09-02 15:02:03 【问题描述】:

我们正在使用 DBT 运行自动化 CI/CD 以在 Snowflake 中配置我们的所有资源,包括数据库、模式、用户、角色、仓库等。

我们在创建仓库时会出现问题 - 活动仓库会自动切换到新创建的仓库。无论仓库是否已经存在,都会发生这种情况(我们使用CREATE WAREHOUSE IF NOT EXISTS 命令)。

这基本上会无缘无故地恢复/打开我们所有的仓库(即使我们使用的是INITIALLY_SUSPENDED = TRUE),因为雪花随后会使用该仓库来执行后续查询。然后我们的 CI/CD 继续在错误的仓库中(无论哪个是最后一个执行的)。我们有一个专门的 CI/CD 仓库,我们希望继续在那个仓库上执行(这样我们就可以监控成本)。

我们知道这是in the documentation 指定的默认行为,但是有没有什么方法可以不使用它来创建仓库?

我希望CREATE WAREHOUSE 命令有一个像USE_WAREHOUSE = TRUE|FALSE 这样的参数。

作为一种解决方法,如果仓库已经存在,我们正在探索完全跳过 CREATE WAREHOUSE 命令的方法,但这并不能解决确实需要创建仓库的问题。

否则,我们可能只是在每个 CREATE WAREHOUSE 之后添加一个 USE WAREHOUSE 命令,以便返回原始 CI/CD 仓库。

【问题讨论】:

【参考方案1】:

想法是将当前仓库存储在一个变量中并恢复它:

SET warehouse_name = (SELECT CURRENT_WAREHOUSE());

CREATE WAREHOUSE TEST WAREHOUSE_SIZE=XSMALL, INITIALLY_SUSPENDED=TRUE;

USE WAREHOUSE IDENTIFIER($warehouse_name);

或者用存储过程包装它(简化版 - 没有错误处理,只有仓库名称作为参数提供):

CREATE OR REPLACE PROCEDURE create_warehouse(CURRENT_WAREHOUSE_NAME STRING
                                            ,WAREHOUSE_NAME STRING)
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
 var rs = snowflake.execute(sqlText: `CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER(?) WAREHOUSE_SIZE=MEDIUM, INITIALLY_SUSPENDED=TRUE`, binds:[WAREHOUSE_NAME]);   
 // restore original warehouse, USE WAREHOUSE cannot be used inside SP
 var rs2 = snowflake.execute(sqlText:`CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER(?)`, binds:[CURRENT_WAREHOUSE_NAME]);   
 return 'Done.';
$$;

CALL create_warehouse(CURRENT_WAREHOUSE(), 'TEST');

【讨论】:

是的,就是这样! ? 幸运的是,我可以从当前 DBT 配置文件中硬编码或以编程方式确定 CI 仓库的名称(因此无需将其存储在 SQL 变量中)。【参考方案2】:

Snowflake docs 描述了一个INITIALLY_SUSPENDED 属性,默认为 FALSE,它指定仓库最初是否应在 Suspended 状态下创建。

我认为您应该在脚本中设置该属性 TRUE

【讨论】:

另外,还有一点:and continues our CI/CD on the wrong warehouse (whichever one was the last one to execute)。 Snowflake 会将会话上下文设置为最近创建的数据库、模式和仓库。在您的 CI/CD 脚本中,您可以在创建新脚本后运行 use warehouse original_warehouse,以便将其设置回您想要的脚本。 @Schepo:我们已经在这样做了。那不是问题。问题是 Snowflake 会自动将仓库 USE 作为当前仓库,并自动恢复它以执行后续查询——即使它是使用 INITIALLY_SUSPENDED = TRUE 创建的。

以上是关于Snowflake:有没有不使用就可以创建仓库的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Snowflake 数据仓库中的模式版本控制

在存储过程中创建 Snowflake 仓库会更改当前仓库

Snowflake 仓库是不是基于 EC2 之类的虚拟机?

在试用帐户上创建 Snowflake 共享?不存在的错误

Snowflake 多集群仓库性能 vs 大仓库规模的单仓库

如何从 Snowflake Stage 加载大型 JSON 文件?