带有 json 文件的 databricks 集群编辑命令

问题描述 投票:0回答:1

我在databricks工作区(Azure)中有许多UI集群,每个集群都有spark环境变量。在自动化流程(CI/CD 管道)中,我想将 cluster_id 值添加到每个集群的现有 Spark 环境变量中。 我使用

az databricks workspaces list | ConvertFrom-Json
命令获取工作区列表
databricks clusters list --output JSON | ConvertFrom-Json
命令获取所有集群的 json 配置。然后我将 cluster_id 属性添加到spark_env_vars。

我的方法是将检索到的 JSON 配置保存到临时文件,使用 PowerShell 将 cluster_id 值添加到 Spark_env_vars 部分,然后使用

databricks clusters edit --json @$tempFile
将其应用到集群。

我面临的问题是编辑命令抛出警告并且没有应用更新的 JSON。警告列表包含许多属于我的 JSON 一部分的字段,警告文本如下:

  • 警告:未知字段:cluster_source
  • 警告:未知字段:creator_user_name
  • 警告:未知字段:default_tags
  • 警告:未知字段:last_restarted_time
  • 警告:未知字段:last_state_loss_time

在我看来,这些字段是只读的,这就是它失败的原因,但我想知道还有什么方法可以做到这一点?我想避免在代码只读字段中进行过滤,并且希望应该有一种更简单的方法将 Spark 环境变量添加到现有集群。

重要的是已经有一些其他的 Spark 环境。变量,所以我必须保留它们并仅添加 cluster_id 作为附加变量。

此外,在警告列表的末尾,我收到一个错误:

Error: failed to reach RUNNING, got TERMINATED: Inactive cluster terminated (inactive for 20 minutes).
,在我看来,edit databricks cli 命令正在尝试启动集群? - 为什么,在 databricks 文档中指出

如果集群处于 RUNNING 或 TERMINATED 状态,则可以对其进行更新。

当我尝试编辑其配置时,我的集群处于终止状态。

或者也许有一种方法可以只检索可写字段列表?我还想尝试仅使用 Spark 环境变量应用 json,但在文档中读到我必须提供完整的 json 文件,就像如果我只提供 Spark 环境变量,它将失败/丢失所有其他配置。

更新: 我尝试应用的临时 JSON 文件的内容:

{
    "autoscale": {
      "max_workers": 8,
      "min_workers": 1
    },
    "autotermination_minutes": 20,
    "azure_attributes": {
      "availability": "ON_DEMAND_AZURE",
      "first_on_demand": 1,
      "spot_bid_max_price": -1
    },
    "cluster_id": "1111-11111-1kj1k2",
    "cluster_name": "my-cluster-name",
    "cluster_source": "UI",
    "creator_user_name": "***",
    "custom_tags": {
      "cluster-purpose": "compute",
      "driver-node-sku": "Standard_DS3_v2",
      "service": "databricks-cluster",
      "team": "dev",
      "vm-purpose": "db_cluster",
      "worker-node-sku": "Standard_DS3_v2"
    },
    "data_security_mode": "USER_ISOLATION",
    "default_tags": {
      "ClusterId": "1111-11111-1kj1k2",
      "ClusterName": "my-cluster-name",
      "Creator": "***",
      "Vendor": "Databricks",
      "application": "databricks",
      "cost-category": "processing",
      "disaster-recovery": "none",
      "service-classification": "private"
    },
    "driver_node_type_id": "Standard_DS3_v2",
    "enable_elastic_disk": true,
    "enable_local_disk_encryption": false,
    "last_restarted_time": 1844324754432,
    "last_state_loss_time": 1844348533345,
    "node_type_id": "Standard_DS3_v2",
    "policy_id": "KDDSFFS8433D",
    "spark_conf": {
      "fs.azure.account.auth.type": "",
      "fs.azure.account.oauth.provider.type": "",
      "fs.azure.account.oauth2.client.endpoint": "",
      "fs.azure.account.oauth2.client.id": "",
      "fs.azure.account.oauth2.client.secret": ""
    },
    "spark_context_id": 34950873489578234,
    "spark_env_vars": {
      "AZ_RSRC_GRP_NAME": "rg",
      "AZ_RSRC_NAME": "db-1",
      "AZ_RSRC_PROV_NAMESPACE": "Microsoft.Databricks",
      "AZ_RSRC_TYPE": "workspaces",
      "AZ_SUBSCRIPTION_ID": "",
      "AZ_TENANT_ID": "",
      "CLIENT_ID": "",
      "CLIENT_SECRET": "",
      "DB_CLUSTER_NAME": "my-cluster-name",
      "DCP_URL": "",
      "DCR_ID": "",
      "DCR_STREAMNAME": "",
      "PROJ_ENV": "dev",
      "LOG_ANALYTICS_WORKSPACE_ID": "54jh6m45",
      "LOG_ANALYTICS_WORKSPACE_KEY": "",
      "DB_CLUSTER_ID": "1111-11111-1kj1k2"
    },
    "spark_version": "14.3.x-scala2.12",
    "start_time": 1844324754432,
    "state": "TERMINATED",
    "state_message": "Inactive cluster terminated (inactive for 20 minutes).",
    "terminated_time": 1844348533345,
    "termination_reason": {
      "code": "INACTIVITY",
      "parameters": {
        "inactivity_duration_min": "20"
      },
      "type": "SUCCESS"
    }
  }

有趣的是,我使用

edit clusters
命令检索的文件有 80 行,我在 Spark 环境变量中添加了 1 行带有 DB_CLUSTER_ID 的文件,如果我转到 databricks 工作区集群并单击查看 JSON,它只有 57 行,所以
edit
命令我返回更多属性,您可以在集群页面上看到这些属性。

json databricks azure-databricks databricks-cli
1个回答
0
投票

get
的输出不是
edit
的有效输入。

大多数采用

--json
参数的 databricks cli 命令将接受相应 REST API 将接受的 json。在这种情况下
/api/2.1/clusters/edit

例如添加/更新 Spark 环境变量。

PS:请参阅底部的陷阱。

创建:

~ $ dbk clusters create --no-wait --json '{
  "cluster_name": "my-cluster",
  "spark_version": "14.3.x-scala2.12",
  "node_type_id": "i3.xlarge",
  "spark_env_vars": {
    "my.name": "kash"
  },
  "aws_attributes": {
    "first_on_demand": 1,
    "availability": "SPOT",
    "zone_id": "us-east-1"
  },
  "num_workers": 5
}'
{
  "cluster_id":"1112-231831-3fzzepx1"
}
~ $ dbk clusters get 1112-231831-3fzzepx1 > old.json

~ $ grep -nA 2 spark_env_vars old.json
26:  "spark_env_vars": {
27-    "my.name":"kash"
28-  },
--
39:    "spark_env_vars": {
40-      "my.name":"kash"
41-    },

~ $

更新:

~ $ dbk clusters edit --json '{
  "cluster_name": "my-cluster",
  "cluster_id": "1112-231831-3fzzepx1",
  "num_workers": 5,
  "spark_version": "14.3.x-scala2.12",
  "node_type_id": "i3.xlarge",
  "spark_env_vars": {
    "my.name": "1gentlemann",
    "cluster_id": "1112-231831-3fzzepx1"
  }
}'
Error: failed to reach RUNNING, got TERMINATED: Finding instances for new nodes, acquiring more instances if necessary
~ $ dbk clusters get 1112-231831-3fzzepx1 > new.json

~ $ grep -nA 3 spark_env_vars new.json
26:  "spark_env_vars": {
27-    "cluster_id":"1112-231831-3fzzepx1",
28-    "my.name":"1gentlemann"
29-  },
--
36:    "spark_env_vars": {
37-      "cluster_id":"1112-231831-3fzzepx1",
38-      "my.name":"1gentlemann"
39-    },

~ $

小问题是 Databricks 更新了更新 JSON 中未提及的一些内容。因此,更改您的更新 json 以显式包含您不希望 Databricks 更改的所有属性。

~ $ diff -y old.json new.json
    "availability":"SPOT",         |     "availability":"SPOT_WITH_FALLBACK",
    "first_on_demand":1,           |     "first_on_demand":0,
                                   >     "cluster_id":"1112-231831-3fzzepx1",
    "aws_attributes": {            |     "apply_policy_default_values":false,
      "availability":"SPOT",       <
      "first_on_demand":1,         <
      "zone_id":"us-east-1"        <
    },                             <
                                   >       "cluster_id":"1112-231831-3fzzepx1",

~ $

© www.soinside.com 2019 - 2024. All rights reserved.