从多个数据块实例收集集群信息

Gather cluster info from multiple databricks instances

我在我们的 Azure 门户中拥有管理员访问权限,我可以使用它登录到我们拥有的任何数据块实例。 我想以编程方式从每个工作区收集信息,但我没有像大多数指南期望的那样登录到每个数据块实例(以获取访问令牌)。 我想在我们的预留实例中识别所有未使用 VM SKU 的工作区中的数据块集群。

如何收集 json 文件进行分析,其中包含:

无需登录每个工作区,而只需使用我的 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