1

我正在尝试使用 Databricks Terraform 提供程序通过 Azure Active Directory 直通将我的 ADLS gen2 存储容器挂载到 DBFS 中。我正在按照此处此处的说明进行操作,但是当 Terraform 尝试部署挂载资源时出现以下错误:

错误:找不到 ADLS Gen2 令牌

我的 Terraform 代码如下所示(与提供程序文档中的示例非常相似),我正在使用 Azure 服务主体进行部署,该主体在同一模块中创建 Databricks 工作区:

provider "databricks" {
  host                        = azurerm_databricks_workspace.this.workspace_url
  azure_workspace_resource_id = azurerm_databricks_workspace.this.id
}

data "databricks_node_type" "smallest" {
  local_disk = true

  depends_on = [azurerm_databricks_workspace.this]
}

data "databricks_spark_version" "latest" {
  depends_on = [azurerm_databricks_workspace.this]
}

resource "databricks_cluster" "passthrough" {
  cluster_name            = "terraform-mount"
  spark_version           = data.databricks_spark_version.latest.id
  node_type_id            = data.databricks_node_type.smallest.id
  autotermination_minutes = 10
  num_workers             = 1

  spark_conf = {
    "spark.databricks.cluster.profile"                = "serverless",
    "spark.databricks.repl.allowedLanguages"          = "python,sql",
    "spark.databricks.passthrough.enabled"            = "true",
    "spark.databricks.pyspark.enableProcessIsolation" = "true"
  }

  custom_tags = {
    "ResourceClass" = "Serverless"
  }
}

resource "databricks_mount" "mount" {
  for_each = toset(var.storage_containers)

  name       = each.value
  cluster_id = databricks_cluster.passthrough.id
  uri        = "abfss://${each.value}@${var.sa_name}.dfs.core.windows.net"

  extra_configs = {
    "fs.azure.account.auth.type"                   = "CustomAccessToken",
    "fs.azure.account.custom.token.provider.class" = "{{sparkconf/spark.databricks.passthrough.adls.gen2.tokenProviderClassName}}",
  }

  depends_on = [
    azurerm_storage_container.data
  ]
}

(为了清楚起见,azurerm_storage_container.data是一组名称为 from 的存储容器var.storage_containers,它们是在azurerm_storage_accountwith name中创建的var.sa_name;因此是 URI。)

我觉得这个错误是由于我的基本误解,而不是简单的遗漏。我的基本假设是,我可以通过 AAD 直通为工作区安装存储容器,以便在我部署整个基础架构时方便。也就是说,每当用户使用工作空间时,任何新的直通集群都将能够使用这些挂载而无需设置。

我可以按照 AAD 直通说明手动安装存储容器:启动启用直通的高并发集群,然后使用dbutils.fs.mount. 这是在使用我的用户身份(而不是服务主体)登录到 Databricks 工作区时。这是问题的根源吗?服务主体是否不适合此任务?

(有趣的是,如果我尝试使用未启用直通的集群访问手动创建的挂载上的文件,Databricks 运行时会给我完全相同的错误。)

4

1 回答 1

0

是的,这是由于对该操作使用服务主体而产生的问题。 Azure docs for credentials passthrough 说

您不能将配置了 ADLS 凭据(例如服务主体凭据)的集群与凭据传递一起使用。

于 2022-02-17T12:43:07.717 回答