Databricks Premium环境下适配dbt的Azure Blob Storage访问方案咨询
针对你的约束条件(无需集群全局配置、支持SAS令牌、兼容有无HNS的存储账户、dbt可直接访问),以下是几种可行方案:
方案1:Databricks Secrets + dbt环境变量注入
通过环境变量动态传递SAS令牌,结合Databricks Secrets管理凭据,无需修改集群配置:
- 在Databricks中创建密钥范围,分别存储不同权限的SAS令牌(如
storage-sas-read、storage-sas-write) - 配置dbt
profiles.yml,通过环境变量引用SAS配置:dbt_databricks_profile: target: dev outputs: dev: type: databricks host: <你的Databricks工作区URL> http_path: <集群HTTP路径> token: <Databricks访问令牌> schema: <目标Schema> extra_config: spark.azure.storage.account.name.<存储账户名>.blob.core.windows.net.sas: "{{ env_var('DBT_STORAGE_SAS') }}" - 启动dbt作业时,根据权限需求传入对应SAS令牌:
# 只读作业 export DBT_STORAGE_SAS=$(databricks secrets get --scope <密钥范围> --key storage-sas-read) && dbt run # 读写作业 export DBT_STORAGE_SAS=$(databricks secrets get --scope <密钥范围> --key storage-sas-write) && dbt run - dbt模型中直接使用存储路径:
-- 无HNS存储账户(用wasbs协议) SELECT * FROM parquet.`wasbs://<容器名>@<存储账户名>.blob.core.windows.net/<数据路径>` -- 有HNS存储账户(用abfss协议) SELECT * FROM parquet.`abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<数据路径>`
方案2:Unity Catalog External Locations + SAS存储凭据(仅ADLS Gen2)
若部分存储账户为启用HNS的ADLS Gen2,可利用Unity Catalog的存储凭据功能(支持SAS令牌):
- 在Unity Catalog中创建基于SAS的存储凭据:
CREATE CREDENTIAL storage_sas_cred WITH ( TYPE = 'SAS', SAS_TOKEN = SECRET('<密钥范围>', '<SAS令牌密钥>') ); - 创建外部位置并关联凭据:
CREATE EXTERNAL LOCATION adls_gen2_location URL 'abfss://<容器名>@<存储账户名>.dfs.core.windows.net/' WITH (CREDENTIAL storage_sas_cred); - 给dbt对应的Databricks主体分配不同权限(如
SELECT对应只读,MODIFY对应读写),模型中直接引用外部位置路径或绑定的外部表:SELECT * FROM <Schema名>.<外部表名>
方案3:dbt宏动态注入Spark配置
通过dbt宏在模型执行前动态加载SAS令牌,无需依赖外部环境变量:
- 编写dbt宏:
{% macro set_storage_sas(secret_scope, secret_key, storage_account) %} {% set sas_token = databricks_secrets(secret_scope, secret_key) %} {% do run_query(f"SET spark.azure.storage.account.name.{storage_account}.blob.core.windows.net.sas = '{sas_token}'") %} {% endmacro %} - 在dbt模型开头调用宏,指定对应的密钥和存储账户:
{{ set_storage_sas('<密钥范围>', 'storage-sas-read', '<存储账户名>') }} SELECT * FROM parquet.`wasbs://<容器名>@<存储账户名>.blob.core.windows.net/<数据路径>`
核心注意事项
- 无HNS的存储账户必须使用
wasbs://协议,abfss://仅支持启用HNS的ADLS Gen2账户 - 所有凭据必须存储在Databricks Secrets中,禁止硬编码
- 临时集群无需预配置任何存储凭据,由dbt动态加载,降低维护成本
内容的提问来源于stack exchange,提问作者TrayMan
相关产品推荐
相关产品推荐

