使用PowerShell批量部署Databricks Workspace时第二次执行死锁报错
问题场景
通过YAML流水线运行PowerShell脚本批量部署Databricks Workspace,首次循环能成功创建资源组、存储账户及Databricks Workspace,但第二次循环时,除Databricks Workspace外其他资源均可创建,抛出死锁错误。
相关代码
创建Databricks的函数
function Create-Databricks { param ( [string] $rgName, [string] $dbName ) az extension add --name databricks az databricks workspace create --resource-group $rgName --name $dbName --location westeurope --output none }
批量创建的循环逻辑
foreach ($key in $iniContent["trainees"].Keys) { # 获取学员姓名 $traineeName = $iniContent["trainees"][$key] # 设置Azure上下文 # az account set --subscription "721fd46a-a810-4202-aa25-8b58b0410e1b" $names = $traineeName -split ' ' $lastname = ($traineeName -split ' ')[1].Substring(0, [Math]::Min(5, $traineeName.IndexOf(" "))).ToLower() # 资源组名称 $resourceGroupName = "rg-academy-databricks-$lastname" # 存储账户名称 $storageName = "stacademy$lastname" # Databricks工作区名称 $databricksName = "dbs-academy-course-$lastname-001" $accessconnectorName = "dbscon-academy-course-$lastname-001" .... # 检查Databricks工作区是否已存在 $dbExists = Get-AzDataBricksWorkspace -ResourceGroupName $resourceGroupName -Name $databricksName -ErrorAction SilentlyContinue if (-not $dbExists) { Write-Output "Databricks工作区 $databricksName 不存在,开始创建..." # 调用函数创建Databricks工作区 Create-Databricks -rgName $resourceGroupName -dbName $databricksName -tags $tags } else { Write-Output "Databricks工作区 $databricksName 已存在,跳过创建步骤。" } }
报错信息
WARNING: 默认已启用预览版扩展安装,该设置将于2024年5月禁用。如需启用请使用'--allow-preview true',仅安装稳定版请使用'--allow-preview false'。
WARNING: 扩展'databricks' 0.10.2已安装。
ERROR: 命令因意外错误失败,回溯信息如下:
ERROR: 在2811310367824位置检测到_ModuleLock('msrest.exceptions')死锁回溯 (最近的调用最后):
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\knack/cli.py", 行233, in invoke
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/init.py", 行664, in execute
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/init.py", 行731, in _run_jobs_serially
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/init.py", 行712, in _run_job
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/init.py", 行1035, in call
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/aaz/_poller.py", 行108, in result
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/core/tracing/decorator.py", 行76, in wrapper_use_tracer
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/aaz/_poller.py", 行130, in wait
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/aaz/_poller.py", 行83, in _start
文件 "C:\Program Files\Common Files\AzureCliExtensionDirectory\databricks\azext_databricks\aaz\latest\databricks\workspace_create.py", 行206, in _execute_operations
self.pre_operations()
文件 "C:\Program Files\Common Files\AzureCliExtensionDirectory\databricks\azext_databricks\custom.py", 行38, in pre_operations
from msrestazure.tools import is_valid_resource_id, resource_id
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\msrestazure/init.py", 行28, in
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\msrestazure/azure_configuration.py", 行34, in
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\msrest/init.py", 行28, in
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\msrest/configuration.py", 行38, in
文件 "D:\a_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\msrest/universal_http/init.py", 行53, in
文件 "", 行1173, in _find_and_load
文件 "", 行171, in enter
文件 "", 行116, in acquire
_frozen_importlib._DeadlockError: 在2811310367824位置检测到_ModuleLock('msrest.exceptions')死锁
解决办法
- 提前安装Databricks扩展:把
az extension add --name databricks移到循环外执行,避免每次循环都尝试安装扩展,减少模块加载冲突。修改后的代码示例:
# 在循环前仅执行一次扩展安装 az extension add --name databricks --allow-preview false function Create-Databricks { param ( [string] $rgName, [string] $dbName ) az databricks workspace create --resource-group $rgName --name $dbName --location westeurope --output none }
- 改用PowerShell Az模块创建工作区:替换Azure CLI命令为
New-AzDatabricksWorkspacecmdlet,避免两种工具间的模块加载冲突。示例:
function Create-Databricks { param ( [string] $rgName, [string] $dbName ) New-AzDatabricksWorkspace -ResourceGroupName $rgName -Name $dbName -Location westeurope }
- 添加循环延迟:在每次创建Databricks工作区后添加短暂延迟,缓解连续操作导致的资源锁定问题:
Create-Databricks -rgName $resourceGroupName -dbName $databricksName -tags $tags Start-Sleep -Seconds 10
内容的提问来源于stack exchange,提问作者play_something_good

