Jdbc 使用ActiveDirectoryPassword连接到Azure SQL DB时出错

Jdbc 使用ActiveDirectoryPassword连接到Azure SQL DB时出错,jdbc,databricks,adal4j,Jdbc,Databricks,Adal4j,我正在尝试从Databricks连接Azure sql db,并使用AAD密码验证。我导入了azure sql db和adal4j库。但仍然低于误差 java.lang.NoClassDefFoundError: com/nimbusds/oauth2/sdk/AuthorizationGrant 堆栈跟踪: at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUt

我正在尝试从Databricks连接Azure sql db,并使用AAD密码验证。我导入了azure sql db和adal4j库。但仍然低于误差

java.lang.NoClassDefFoundError: com/nimbusds/oauth2/sdk/AuthorizationGrant
堆栈跟踪:

    at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUtils.java:24)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.getFedAuthToken(SQLServerConnection.java:3609)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.onFedAuthInfo(SQLServerConnection.java:3580)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.processFedAuthInfo(SQLServerConnection.java:3548)
    at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onFedAuthInfo(tdsparser.java:261)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:103)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4290)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3157)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:82)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3121)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2478)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2026)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1687)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1528)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:866)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:569)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:63)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:54)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:56)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:115)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:5
at com.databricks.backend.daemon.driver.DriverWrapper.tryExecutingCommand(DriverWrapper.scala:590)
    at com.databricks.backend.daemon.driver.DriverWrapper.getCommandOutputAndError(DriverWrapper.scala:474)
    at com.databricks.backend.daemon.driver.DriverWrapper.executeCommand(DriverWrapper.scala:548)
    at com.databricks.backend.daemon.driver.DriverWrapper.runInnerLoop(DriverWrapper.scala:380)
    at com.databricks.backend.daemon.driver.DriverWrapper.runInner(DriverWrapper.scala:327)
    at com.databricks.backend.daemon.driver.DriverWrapper.run(DriverWrapper.scala:215)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.nimbusds.oauth2.sdk.AuthorizationGrant
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
如果有人解决了这个问题,请帮助我

下载工作笔记本

创建Databricks集群 已知工作配置-Databricks Runtime 5.2包括ApacheSpark 2.4.0和Scala 2.11

为Microsoft Azure SQL数据库和SQL Server安装Spark连接器 导航到群集>库>安装新的>Maven>搜索软件包 切换到Maven Central 搜索azure sqldb spark com.microsoft.azure:azure sqldb spark 单击选择 单击“安装” 已知工作版本-com.microsoft.azure:azure sqldb spark:1.0.2

更新变量 更新变量值客户名称、服务器、数据库、表、用户名、密码

仅运行一次初始化命令 这将执行以下操作:

在dbfs:/databricks/init下创建一个名为init的文件夹/ Creta一个子文件夹,名称为Databricks集群 为每个依赖项创建bash脚本 Bash脚本命令: *wget:从web服务器检索内容 *-退出:关闭wget的输出 *-O:输出

依赖项:

重新启动Databricks群集 这是执行init脚本所必需的

运行此笔记本中的最后一个单元格 这将测试通过Active Directory身份验证连接到Azure SQL数据库的能力

初始化命令

//初始化 //此代码块只需运行一次即可为重新启动时保留的集群文件创建初始化脚本 //获取集群名称 var clusterName=dbutils.widgets.getcluster //创建dbfs:/databricks/init/如果它不存在。 dbutils.fs.mkdirsdbfs:/databricks/init/ //使用Databricks文件系统-DBFS创建一个名为clusterName的目录。 dbutils.fs.mkdirssdbfs:/databricks/init/$clusterName/ //创建adal4j脚本。 dbutils.fs.puts/databricks/init/$clusterName/adal4j-install.sh, !/bin/bash wget-quiet-O/mnt/driver-daemon/jars/adal4j-1.6.0.jarhttp://central.maven.org/maven2/com/microsoft/azure/adal4j/1.6.0/adal4j-1.6.0.jar wget-quiet-O/mnt/jars/driver-daemon/adal4j-1.6.0.jarhttp://central.maven.org/maven2/com/microsoft/azure/adal4j/1.6.0/adal4j-1.6.0.jar符合事实的 //创建oauth2脚本。 dbutils.fs.put/databricks/init/$clusterName/oauth2-install.sh, !/bin/bash wget-quiet-O/mnt/driver-daemon/jars/oauth2-oidc-sdk-5.24.1.jarhttp://central.maven.org/maven2/com/nimbusds/oauth2-oidc-sdk/5.24.1/oauth2-oidc-sdk-5.24.1.jar wget-quiet-O/mnt/jars/driver-daemon/oauth2-oidc-sdk-5.24.1.jarhttp://central.maven.org/maven2/com/nimbusds/oauth2-oidc-sdk/5.24.1/oauth2-oidc-sdk-5.24.1.jar符合事实的 //创建json脚本。 dbutils.fs.puts/databricks/init/$clusterName/json-smart-install.sh, !/bin/bash wget-quiet-O/mnt/driver-daemon/jars/json-smart-1.1.jarhttp://central.maven.org/maven2/net/minidev/json-smart/1.1.1/json-smart-1.1.1.jar wget-quiet-O/mnt/jars/driver-daemon/json-smart-1.1.jarhttp://central.maven.org/maven2/net/minidev/json-smart/1.1.1/json-smart-1.1.1.jar符合事实的 //创建jwt脚本。 dbutils.fs.puts/databricks/init/$clusterName/jwt-install.sh, !/bin/bash wget-quiet-O/mnt/driver-daemon/jars/nimbus-jose-jwt-7.0.1.jarhttp://central.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/7.0.1/nimbus-jose-jwt-7.0.1.jar wget-quiet-O/mnt/jars/driver-daemon/nimbus-jose-jwt-7.0.1.jarhttp://central.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/7.0.1/nimbus-jose-jwt-7.0.1.jar符合事实的 //检查集群特定的初始化脚本是否存在。 displaydbutils.fs.lssdbfs:/databricks/init/$clusterName/ 测试命令

//通过Active Directory密码验证连接到Azure SQL数据库 导入com.microsoft.azure.sqldb.spark.config.config 导入com.microsoft.azure.sqldb.spark.connect_ //获取小部件值 var server=dbutils.widgets.getserver var database=dbutils.widgets.getdatabase var table=dbutils.widgets.gettable var username=dbutils.widgets.getuser var password=dbutils.widgets.getpassword val config=ConfigMap url->s$server.database.windows.net, databaseName->s$数据库, dbTable->s$table, 用户->s$username, 密码->s$密码, 身份验证->ActiveDirectoryPassword, 加密->真, ServerCertificate->false, hostNameInCertificate->*.database.windows.net val collection=sqlContext.read.sqlDBconfig 收藏展 作为2020年更新:

我做了如上所述的集群初始化脚本,但最终我的工作设置似乎并不需要这样做

我最终使用了scala 2.11 note 2.11,这些库是通过UI:com.microsoft.azure:azure sqldb spark:1.0.2和mssql_jdbc_8_2_2_jre8.jar note jre8安装的。此外,我还必须在配置中明确提到驱动程序类:

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
   "url"            -> "....database.windows.net",
   "databaseName"   -> "...",
   "dbTable"        -> "...",
   "accessToken"           -> "...",
   "hostNameInCertificate" -> "*.database.windows.net",
   "encrypt"               -> "true",
   "ServerCertificate"      -> "false",
   "driver"                 -> "com.microsoft.sqlserver.jdbc.SQLServerDriver"
))

val collection = spark.read.sqlDB(config)
collection.show()
代币采集完成 使用msal python:

进口msal 租户ID=…guid。。。 授权=https://login.microsoftonline.com/ +租户
范围=https://database.windows.net//.default 类路径上缺少一个库,该库包含类com.nimbusds.oauth2.sdk.AuthorizationGrantRelated,可能重复:另请参见感谢标记的回复。我将oauth2-oidc-sdk-3.0.jar导入我的工作区并连接到集群。我需要在什么地方注册吗。还上传了代码片段
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
   "url"            -> "....database.windows.net",
   "databaseName"   -> "...",
   "dbTable"        -> "...",
   "accessToken"           -> "...",
   "hostNameInCertificate" -> "*.database.windows.net",
   "encrypt"               -> "true",
   "ServerCertificate"      -> "false",
   "driver"                 -> "com.microsoft.sqlserver.jdbc.SQLServerDriver"
))

val collection = spark.read.sqlDB(config)
collection.show()