gpt4 book ai didi

azure - 在 Azure 上部署多个 databricks 工作区时如何配置 Terraform Databricks 提供程序

转载 作者:行者123 更新时间:2023-12-02 08:14:20 24 4
gpt4 key购买 nike

对于我当前的项目,我已使用 Terraform 在 Azure 上部署了一个 Databricks 工作区,并且我正在尝试创建一个额外的工作区。我的代码存储库基于多个模块,我想使用 Terraform 将其他工作区添加到我的 Azure 订阅。然而,事情并没有按照我想要的方式进行,因为我无法为不同的工作区创建集群。创建 databricks 工作区不是问题,创建相关的 databricks 提供程序资源才是问题。

目录结构(我有其他模块,但未包含这些模块,因为它们与此问题无关):

 .
|-config
| |-dev.tfvars
|-main.tf
|-outputs.tf
|-providers.tf
|-variables.tf
|-modules
| |-db-cluster
| | |-main.tf
| | |-outputs.tf
| | |-variables.tf
| |-dbw
| | |-main.tf
| | |-outputs.tf
| | |-variables.tf
| |-network
| | |-main.tf
| | |-outputs.tf
| | |-variables.tf

利用模块,我使用根文件夹中的 main.tf 文件来确定模块,然后该模块应该创建(基于计数等内容)相关资源。

例如,在下面的 main.tf 文件中,我们确定 databricks 工作区模块 (dbw) 和 databricks 集群模块 (db-cluster)。

# ./main.tf file in the root module
# Databricks workspace
module "dbw-default" {
count = length(var.dbw-names)
source = "./modules/dbw"
dbw-name = var.dbw-names[count.index]
dbw-project = var.project
dbw-env = var.env
dbw-resource-group-name = module.rg-default[index(var.rg-names, "databricks")].name
dbw-location = var.location
dbw-sku = var.dbw-sku
dbw-tags = merge(var.tags, { "purpose" = "databricks", "env" = var.env })
}
# Databricks Cluster
module "db-cluster-default" {
source = "./modules/db-cluster"
db-cluster-name = var.db-cluster-name
db-cluster-env = var.env
db-cluster-project = var.db-cluster-project

db-cluster-tags = merge(var.tags, { "purpose" = "databricks", "env" = var.env })
db-cluster-min-workers = var.db-cluster-min-workers
db-cluster-max-workers = var.db-cluster-max-workers
db-cluster-autotermination-minutes = var.db-cluster-autotermination-minutes

}

这与 dbw 模块中的 main.tf 相结合(如下详述),使用 azure_rm 提供程序创建 databricks 工作区。

# ./modules/dbw/main.tf
resource "azurerm_databricks_workspace" "default" {
name = format("dbw-%s-%s-%s", var.dbw-name, var.dbw-project, var.dbw-env)
resource_group_name = var.dbw-resource-group-name
location = var.dbw-location
sku = var.dbw-sku
tags = var.dbw-tags
}

最后,我们有了 databricks 集群模块,其中再次指定了提供程序。

# ./modules/db-cluster/main.tf
terraform {
required_providers {
databricks = {
source = "databricks/databricks"
version = "~> 1.6"
}
}
}

resource "databricks_cluster" "shared_autoscaling" {
cluster_name = format("db-cluster-%s-%s", var.db-cluster-project, var.db-cluster-env)
spark_version = data.databricks_spark_version.latest_lts.id
node_type_id = data.databricks_node_type.smallest.id
autotermination_minutes = var.db-cluster-autotermination-minutes
autoscale {
min_workers = var.db-cluster-min-workers
max_workers = var.db-cluster-max-workers
}
}

这与根模块中的提供者 block 相关:

# ./providers.tf
# providers and versions
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.29"
}
databricks = {
source = "databricks/databricks"
version = "~> 1.6"
}
}

backend "azurerm" {
# environment variables are available from YAML pipeline to authenticate using service principal.
}
}

provider "azurerm" {
features {}
}

provider "databricks" {
azure_workspace_resource_id = module.dbw-default.id
}

因此,在制作多个模块时,我在此提供程序 block 中将 module.dbw-default.id 更改为 module.dbw-default[0].id ,但这不起作用。完全忽略此处的引用并仅在数据库集群模块级别使用它也是行不通的。我收到以下错误消息:

Error: cannot read cluster: cannot configure azure-client-secret auth: cannot get workspace: please set `azure_workspace_resource_id` provider argument.

起初我尝试引用 module.dbw-default[0].id 并为此尝试了几种变体,但这不起作用。此外,我尝试将 databricks 的 terraform 提供程序 block 移动到 db-cluster 模块,并将 dbw-id 传递给那里的提供程序中的引用,但这也不起作用。我将非常感谢任何帮助!我想强调的是,这在使用单个工作区时一切正常,但在使用多个工作区时就不再有效。

起初我尝试引用 module.dbw-default[0].id 并为此尝试了几种变体,但这不起作用。此外,我尝试将 databricks 的 terraform 提供程序 block 移动到 db-cluster 模块,但这也不起作用。

最佳答案

好吧,这让我陷入了困境。简而言之,不可能动态设置提供程序。这意味着使用 for_each 指定 databricks 工作区意味着您无法使用 databricks 提供程序为这些工作区动态创建集群(或为其配置任何其他内容)。这与 Terraform 的配置方式有关。有关更多详细信息,请参阅 GitHub 问题 here .

现在如何前进:如果我们的工作空间数量有限,我们可以通过简单地复制根目录中的代码块来显式定义它们(例如 dbw-default-first 、 dbw-default-second ) main.tf 文件。然后在providers.tf文件中,我们可以使用不同的别名列出databricks提供程序的多个副本:

provider "databricks" {
alias = "first"
azure_workspace_resource_id = module.dbw-default-first.id
}

provider "databricks" {
alias = "second"
azure_workspace_resource_id = module.dbw-default-second.id
}

之后,在 main.tf 文件中配置集群或其他数据 block 设置时,我们添加特定的提供程序:

providers = {
databricks = databricks.first
}

同样将其添加到第二个 databricks 集群中。这个解决方案的不幸之处在于我们必须对每个副本进行硬编码,这是一个丑陋的解决方案。不幸的是,这是唯一可行的选项,因为我们无法动态指定它。

关于azure - 在 Azure 上部署多个 databricks 工作区时如何配置 Terraform Databricks 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74706267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com