我在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 一部分的字段,警告文本如下:
在我看来,这些字段是只读的,这就是它失败的原因,但我想知道还有什么方法可以做到这一点?我想避免在代码只读字段中进行过滤,并且希望应该有一种更简单的方法将 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
命令我返回更多属性,您可以在集群页面上看到这些属性。
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",
~ $