从多个数据块实例收集集群信息
Gather cluster info from multiple databricks instances
我在我们的 Azure 门户中拥有管理员访问权限,我可以使用它登录到我们拥有的任何数据块实例。
我想以编程方式从每个工作区收集信息,但我没有像大多数指南期望的那样登录到每个数据块实例(以获取访问令牌)。
我想在我们的预留实例中识别所有未使用 VM SKU 的工作区中的数据块集群。
如何收集 json 文件进行分析,其中包含:
- 所有数据块工作区名称
- 每个工作区中的所有 Databricks 集群,尤其是集群 VM SKU
- 每个集群的所有 VM 运行,包括 VM SKU 和利用率指标
无需登录每个工作区,而只需使用我的 MS 凭据?
az-cli databricks 模块和 databricks CLI 本身是不够的。
值得庆幸的是,我们可以使用访问令牌访问每个工作区的 REST api,而无需手动登录每个工作区。
这是一个循环遍历每个订阅、查找工作区并收集 VM 信息的脚本。
它会将其转储到可用于分析的 data.json
文件中。
Write-Progress "Acquiring access token";
#
$databricksResourceId="2ff814a6-3304-4ab8-85cb-cd0e6f879c1d"; # Programmatic ID for Azure Databricks
$token = az account get-access-token --resource $databricksResourceId --query accessToken --output tsv;
$subs = az account list | ConvertFrom-Json;
$total=New-Object -TypeName System.Collections.ArrayList;
$subIndex=0;
foreach ($sub in $subs)
{
$subIndex++;
Write-Progress "Gathering databricks instances" -Status $sub.name -PercentComplete ($subIndex / $subs.Count * 100) -Id 0;
$workspaces = az databricks workspace list --subscription $sub.id --output json | ConvertFrom-Json;
$i=0;
foreach ($workspace in $workspaces)
{
$i++;
Write-Progress "Gathering instance data" -Status $workspace.name -PercentComplete ($i/$workspaces.Count*100) -Id 1 -ParentId 0;
$headers=@{
"Authorization"= "Bearer " + $token;
"X-Databricks-Azure-Workspace-Resource-Id" = $workspace.Id;
}
$url="https://$($workspace.workspaceUrl)/api/2.0/clusters/list"
Write-Progress "Gathering clusters" -ParentId 1 -Id 2;
$clusters=Invoke-RestMethod -Method Get -Uri $url -Headers $headers -ContentType "application/json" -UseBasicParsing
Write-Progress "Gathering VMs" -ParentId 1 -Id 2;
$workspace.managedResourceGroupId -match "/resourceGroups/(.+)$" > $null;
$managedResourceGroupName = $matches.1;
$vms = az vm list --resource-group $managedResourceGroupName --subscription $sub.id | ConvertFrom-Json;
$vmData=New-Object -TypeName System.Collections.ArrayList;
$j=0;
foreach ($vm in $vms)
{
$j++;
Write-Progress "Gathering VM metrics" -ParentId 2 -Id 3 -PercentComplete ($j / $vms.Count * 100);
$metrics = az monitor metrics list `
--resource $vm.id `
--metrics "Percentage CPU" "Available Memory Bytes" "Disk Write Operations/sec" "Disk Read Operations/sec" "Disk Read Bytes" "Disk Write Bytes" `
--aggregation "Average" "Maximum" "Minimum" "Total" `
--interval "15m" `
--offset "1h" `
--subscription $sub.id `
| ConvertFrom-Json;
$vmData.Add(
@{
vm = $vm
metrics = $metrics
}
) > $null;
}
Write-Progress "Writing progress" -ParentId 1 -Id 2;
$total.Add(
@{
subscriptionId=$sub.id
subscriptionName=$sub.name
workspace=$workspace
clusters=$clusters.clusters
vms=$vmData
}
) > $null;
$total | ConvertTo-Json -Depth 12 > data.json;
}
}
See-also
我在我们的 Azure 门户中拥有管理员访问权限,我可以使用它登录到我们拥有的任何数据块实例。 我想以编程方式从每个工作区收集信息,但我没有像大多数指南期望的那样登录到每个数据块实例(以获取访问令牌)。 我想在我们的预留实例中识别所有未使用 VM SKU 的工作区中的数据块集群。
如何收集 json 文件进行分析,其中包含:
- 所有数据块工作区名称
- 每个工作区中的所有 Databricks 集群,尤其是集群 VM SKU
- 每个集群的所有 VM 运行,包括 VM SKU 和利用率指标
无需登录每个工作区,而只需使用我的 MS 凭据?
az-cli databricks 模块和 databricks CLI 本身是不够的。 值得庆幸的是,我们可以使用访问令牌访问每个工作区的 REST api,而无需手动登录每个工作区。
这是一个循环遍历每个订阅、查找工作区并收集 VM 信息的脚本。
它会将其转储到可用于分析的 data.json
文件中。
Write-Progress "Acquiring access token";
#
$databricksResourceId="2ff814a6-3304-4ab8-85cb-cd0e6f879c1d"; # Programmatic ID for Azure Databricks
$token = az account get-access-token --resource $databricksResourceId --query accessToken --output tsv;
$subs = az account list | ConvertFrom-Json;
$total=New-Object -TypeName System.Collections.ArrayList;
$subIndex=0;
foreach ($sub in $subs)
{
$subIndex++;
Write-Progress "Gathering databricks instances" -Status $sub.name -PercentComplete ($subIndex / $subs.Count * 100) -Id 0;
$workspaces = az databricks workspace list --subscription $sub.id --output json | ConvertFrom-Json;
$i=0;
foreach ($workspace in $workspaces)
{
$i++;
Write-Progress "Gathering instance data" -Status $workspace.name -PercentComplete ($i/$workspaces.Count*100) -Id 1 -ParentId 0;
$headers=@{
"Authorization"= "Bearer " + $token;
"X-Databricks-Azure-Workspace-Resource-Id" = $workspace.Id;
}
$url="https://$($workspace.workspaceUrl)/api/2.0/clusters/list"
Write-Progress "Gathering clusters" -ParentId 1 -Id 2;
$clusters=Invoke-RestMethod -Method Get -Uri $url -Headers $headers -ContentType "application/json" -UseBasicParsing
Write-Progress "Gathering VMs" -ParentId 1 -Id 2;
$workspace.managedResourceGroupId -match "/resourceGroups/(.+)$" > $null;
$managedResourceGroupName = $matches.1;
$vms = az vm list --resource-group $managedResourceGroupName --subscription $sub.id | ConvertFrom-Json;
$vmData=New-Object -TypeName System.Collections.ArrayList;
$j=0;
foreach ($vm in $vms)
{
$j++;
Write-Progress "Gathering VM metrics" -ParentId 2 -Id 3 -PercentComplete ($j / $vms.Count * 100);
$metrics = az monitor metrics list `
--resource $vm.id `
--metrics "Percentage CPU" "Available Memory Bytes" "Disk Write Operations/sec" "Disk Read Operations/sec" "Disk Read Bytes" "Disk Write Bytes" `
--aggregation "Average" "Maximum" "Minimum" "Total" `
--interval "15m" `
--offset "1h" `
--subscription $sub.id `
| ConvertFrom-Json;
$vmData.Add(
@{
vm = $vm
metrics = $metrics
}
) > $null;
}
Write-Progress "Writing progress" -ParentId 1 -Id 2;
$total.Add(
@{
subscriptionId=$sub.id
subscriptionName=$sub.name
workspace=$workspace
clusters=$clusters.clusters
vms=$vmData
}
) > $null;
$total | ConvertTo-Json -Depth 12 > data.json;
}
}