Databricks 15.4 LTS ARM集群连接Azure Key Vault报错排查求助
排查方向
1. 解决依赖版本冲突问题
java.lang.NoSuchMethodError 通常是依赖版本不兼容导致的:
- 检查Databricks集群自带的
azure-core版本,确保它和你安装的azure-identity、azure-keyvault-secrets版本匹配。ClientOptions.getTracingOptions()是azure-core特定版本新增的方法,若集群自带的azure-core版本过低,就会出现该错误。 - 优先使用Azure SDK for Java BOM来统一管理所有Azure SDK依赖版本,避免手动指定单个包版本带来的冲突。在Maven依赖中引入BOM后,只需要声明
azure-identity和azure-keyvault-secrets即可,无需指定版本:<dependencyManagement> <dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-sdk-bom</artifactId> <version>最新稳定版</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 通过Databricks集群的库依赖页面或执行
%sh mvn dependency:tree命令,排查是否存在依赖冲突,排除掉不兼容的旧版本依赖。
2. 适配ARM架构下的HTTP客户端
最初的StacklessClosedChannelException和Netty在ARM架构下的兼容性有关,后续单独添加netty包引发版本冲突,建议:
- 不要单独引入
azure-netty相关包,而是通过Azure SDK BOM自动引入适配当前架构的HTTP客户端依赖。 - 尝试切换为OkHttp作为HTTP客户端,绕开Netty的ARM适配问题。需要安装
azure-core-http-okhttp包(版本和其他Azure SDK保持一致),然后修改代码:import com.azure.core.http.okhttp.OkHttpAsyncHttpClientBuilder import com.azure.security.keyvault.secrets.SecretClient import com.azure.security.keyvault.secrets.models.KeyVaultSecret import com.azure.identity.DefaultAzureCredentialBuilder import com.azure.security.keyvault.secrets.SecretClientBuilder val cred = new DefaultAzureCredentialBuilder().build() val keyVaultClient = new SecretClientBuilder() .vaultUrl("https://my-key-vault-name.vault.azure.net/") .credential(cred) .httpClient(new OkHttpAsyncHttpClientBuilder().build()) // 显式指定OkHttp客户端 .buildClient() val result = keyVaultClient.getSecret("secret-name") println(result.getValue())
3. 针对Databricks Runtime 15.4的特殊检查
- 查看Databricks官方文档中关于Azure SDK兼容性的说明,确认Runtime 15.4(Java 17、Spark 3.5)推荐的Azure SDK版本范围,避免使用不兼容的旧版本。
- 检查集群的Java 17兼容性:确保使用的Azure SDK版本明确支持Java 17,部分旧版本Azure SDK对Java 17和ARM架构的组合支持不足。
4. 身份验证流程的ARM环境适配
虽然权限在其他环境正常,但ARM架构下的身份验证链可能存在差异:
- 尝试显式使用
ManagedIdentityCredential替代DefaultAzureCredential,缩小身份验证范围,排查是否是凭据链中某些环节在ARM下出问题:import com.azure.identity.ManagedIdentityCredentialBuilder val cred = new ManagedIdentityCredentialBuilder().build()
内容的提问来源于stack exchange,提问作者Soundararajan
相关产品推荐
相关产品推荐

